我有一台多线程CPU,希望每个CPU线程都能够启动一个单独的CUDA流。这些独立的CPU线程会在不同的时间做不同的事情,因此有可能它们不会重叠,但如果它们同时启动一个CUDA内核,我希望它们能够继续并发运行。
我相信这是可能的,因为在CUDA Toolkit文档的3.2.5.5节中指出:“流是一系列命令(可能由不同的主机线程发出)…”。因此,如果我想要实现这一点,我需要做如下操作:
我相信这是可能的,因为在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个流。这是正确的方法吗?如果两个或更多不同的主机线程在大约相同时到达此代码,它是否会并发运行?感谢任何帮助!
编辑:
我纠正了代码块中的一些语法问题,并像sgar91建议的那样放入了cudaMemcpyAsync。
stream
指针分配内存。此外,如果您希望流重叠,可以考虑使用cudaMemcpyAsync
。 - sgarizvi