我有一个多线程 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 个流。这是正确的方法吗?如果两个或更多不同的主机线程大约在同一时间到达此代码,这是否会同时运行?谢谢你的帮助!
编辑:
我更正了代码块中的一些语法问题,并按照 sgar91 的建议放入了 cudaMemcpyAsync。