在每个主机线程上创建cuda流(多线程CPU)

时间:2013-10-15 17:41:11

标签: c++ c multithreading cuda

我有一个多线程CPU,我希望CPU的每个线程都能够启动一个单独的CUDA流。单独的CPU线程将在不同的时间执行不同的操作,因此它们可能不会重叠,但如果它们同时启动CUDA内核,我希望它继续同时运行。

我很确定这是可能的,因为在CUDA Toolkit文档部分3.2.5.5中。它说“流是一系列命令(可能由不同的主机线程发出)......”

所以,如果我想实现这个,我会做类似

的事情
void main(int CPU_ThreadID) {
    cudaStream_t *stream;
    cudaStreamCreate(&stream);

    int *d_a;
    int *a;
    cudaMalloc((void**)&d_a, 100*sizeof(int));
    cudaMallocHost((void**)&a, 100*8*sizeof(int));
    cudaMemcpyAsync(d_a, a[100*CPU_ThreadID], 100*size(int), cudaMemcpyHostToDevice, stream);
    sum<<<100,32,0,stream>>>(d_a);

    cudaStreamDestroy(stream);
}

这只是一个简单的例子。如果我知道只有8个CPU线程,那么我知道最多将创建8个流。这是正确的方法吗?如果两个或多个不同的主机线程在同一时间内达到此代码,它会同时运行吗?谢谢你的帮助!

编辑:

我更正了代码块中的一些语法问题,并将sudaMemcpyAsync放入sgar91建议中。

1 个答案:

答案 0 :(得分:2)

我真的认为你提议的是一个多进程应用程序,而不是多线程。你没有提到你想到的线程架构,甚至OS都没有,但我所知道的线程架构没有提出一个名为“main”的线程例程,并且你没有显示线程代码的任何序言。

多进程环境通常会为每个进程创建一个设备上下文,这将抑制细粒度的并发。

即使这只是一个疏忽,我也会指出多线程应用程序应该在生成线程之前在所需的设备上建立GPU上下文。

然后,每个线程都可以发出cudaSetDevice(0);或类似的调用,这会导致每个线程在指定的设备上获取已建立的上下文。

一旦到位,您应该能够从您喜欢的任何线程向所需的流发出命令。

您可能希望参考cudaOpenMP示例代码。虽然它省略了流概念,但它演示了一个多线程应用程序,可能有多个线程向同一设备发出命令(并且可以扩展到同一个流)

在解决上述问题后,内核是否碰巧同时运行是一个单独的问题。并发内核执行有许多requirements,内核本身必须具有兼容的资源要求(块,共享内存,寄存器等),这通常意味着“小”内核。