我有一个多线程CPU,我希望CPU的每个线程能够启动一个单独的CUDA流。单独的CPU线程将在不同的时间做不同的事情,所以有可能它们不会重叠,但如果它们同时启动CUDA内核,我希望它能够继续同时运行。在每个主机线程上创建一个cuda流(多线程CPU)
我很确定这是可能的,因为在CUDA工具包文档部分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个流将被创建。这是做这件事的正确方法吗?如果两个或更多不同的主机线程在同一时间到达此代码,这是否会同时运行?谢谢你的帮助!
编辑:
我纠正一些语法问题中的代码块,并放在cudaMemcpyAsync作为sgar91建议。
您不必'malloc''stream'指针。另外,如果你想让流重叠,你可以考虑使用'cudaMemcpyAsync'。 – sgarizvi
@ sgar91:流将处于不同的上下文中,因此它们将永远不会重叠。 – talonmies
@ sgar91谢谢!我已经在上面进行了这些修改。对于talonmies:那么没有办法让单独的CPU线程同时访问GPU设备吗?如何强制线程使用与Robert Crovella建议的相同的上下文? – Miggy