Linux下多线程使用GPU的问题

先说一下我的配置:1、硬件:单GPU,Tesla C2050,计算能力2.0 。 2、CUDA 版本5.0 。 3、操作系统Linux fedora 16。 我使用pthread_create建立多个CPU线程(在Linux下好像叫轻量级进程lwp)来使用GPU进行计算。 每个线程中都包括多个kernel函数,每个线程都没有使用流。
我的问题是:
1、每个CPU线程分别和GPU绑定到单独的一个CUDA context,还是所有CPU线程和GPU绑定到同一个CUDA context?
2、问题1中如果是封装到多个CUDA context,那么是一个CUDA context执行完再去执行另一个,还是GPU通过不断切换context来使它们并行执行?
3、问题1中如果是封装到同一个CUDA context中,那么是一个CPU线程使用完GPU另一个线程再去使用,还是多CPU线程交叉着给GPU很多kernel,GPU只是按照接收到kernel的顺序去执行,这样就相当于多CPU线程在并行的使用GPU? 我在CPU线程中没有使用流。
版主辛苦了,多谢回答~

LZ您好:

我不是linux用户,无法就linux部分给您建议,下面只谈及CUDA部分。

1:您的情况是后者。

2:因为1:所以此分支跳过。

3:因为您表示“每个线程都没有使用流”,在您没有显式地指定stream的时候,所有这些任务都在默认stream中。以及我不清楚此时多个线程同时向默认stream发布任务的时候其具体顺序如何。一般建议使用多个stream,并使用异步版本的cudaMemcpy和host端的page-locked memory,以实现多个stream之间的传输和计算互相掩盖。

大致如此,供您参考。

祝您编码顺利~

多谢版主回答!我会按照你的建议后面做优化。
我每个CPU线程中的kernel之间会有一点CPU准备数据的时间,所以我确定多CPU线程是交叉着向GPU发送kernel函数的。所以你的意思就是所有这些线程共用默认流,GPU执行的时候是按照接收到CPU线程发送来的kernel的顺序执行的,那么从CPU端来看,就是多个CPU线程在并行的使用GPU吗?

LZ您好:

我只说他们都在默认stream里面,但我不清楚确切的默认stream中的任务发布顺序如何。

大致如此,请其他人予以补充。

祝您好运~

我补充一下,

自CUDA 3.2开始(包含), 一个进程里的多个线程将共享同一个context, 而不是分别建立自己的context(3.1以及以下),

现在的手册已经不再提到这点了,如果您需要参考一些较老的资料,请注意版本区别。

我补充一下,在同一个流里<<<<>>>是多线程安全的,

你先发布了啥,啥就先被执行。

(具体的说,在所有的流里面的<<<>>>发布都是多线程安全的:有一个全局的锁,在进行参数压入的时候进行锁定,直到压入完参数将kernel启动后,释放该锁。
所以较真的说,从所有的流来看,他们的具体发布时间都不会完全一样,而会有微小的差距。
所以总是可以有个发布的先后顺序的,所以楼主无需担心混乱。(如果担心,请使用单独的多个流,每个host thread控制一个流,这样就不会乱了)
)。

谢谢版主的回答!
我还有一个问题,实验室服务器上就只有一块C2050,我要和另外的同学一起使用。当我在使用GPU进行计算的时候,别人还能同时使用GPU吗?如果能使用,这时候应该至少有两个context吧,GPU能在一个context处理空闲的时候切换到另一个context去执行吗?
问题有点较真,不过我不太方便和另外的同学协调使用GPU,我们都是远程登录的。假如我们不小心同时使用GPU,会出现什么情况?

能同时用是能同时用,但可能如果一个人在死循环了,另外一个同学可能无法用.

但是我不确定context的切换是否是抢占式的,如果您的进程(context)中有kernel在死循环,是否你的同学在此时还能用GPU,这个我不确定。

建议不要死循环,普通还是无问题的。