我想在我的代码中使用流,这是我第一次使用它们。
我有2个内核可以同时运行,因为它们可以完成不同的工作。
但是,他们采取相同的输入。如果他们可以在输入的不同部分工作,我可以使用一些偏移,但现在?
int nStreams = 2;
for (int i=0;i<nStreams;i++) {
cudaMemcpyAsync( devInput, hostInput, streamBytes , cudaMemcpyHostToDevice , stream[i] );
Kernel1<<<...,0,stream[i]>>>(devInput, devC);
Kernel2<<<...,0,stream[i+1]>>>(devInput , devR);
}
问题在于这一行:
cudaMemcpyAsync( devInput, hostInput, streamBytes , cudaMemcpyHostToDevice , stream[i] );
如何在两个内核中使用相同的数组?
我想复制它们(hostInput,devInput)并相应地使用,但我不确定它是否是另一种方法。
答案 0 :(得分:2)
您可以在cudaMemcpyAsync
行之后添加stream sync point:
cudaMemcpyAsync( devInput, hostInput, streamBytes , cudaMemcpyHostToDevice , stream1 );
cudaStreamSynchronize(stream1);
Kernel1<<<...,0,stream1>>>(devInput, devC);
Kernel2<<<...,0,stream2>>>(devInput, devR);
现在,在cudaMemcpyAsync
操作完成之前,内核保证不会启动,然后它们将有效访问相同的devInput
数据。