2012-08-16 48 views
1

考虑两个代码片段。cudaMemcpy()调用流

Snippet1 

cudaStream_t stream1, stream2 ; 
cudaStreamCreate(&stream1); 
cudaStreamCreate(&stream2); 
cudaMemcpyAsync(dst, src, size, dir, stream1); 
kernel<<<grid, block, 0, stream2>>>(...); 



Snippet2 
cudaStreamCreate(&stream1); 
cudaStreamCreate(&stream2); 
cudaMemcpy(dst, src, size, dir, stream1); 
kernel<<<grid, block, 0, stream2>>>(...); 

在这两个片段,我发出的memcpy调用(snippet1异步和snippet2同步)

由于命令已经发出两种不同的数据流,从我的理解可能有两种情况可能重叠。

但是在Snippet2中,cudaMemcpy调用是同步的(又名阻塞)会导致我一个似是而非的结论,即cudaMemcpy和内核调用会一个接一个地执行。

哪一个才是正确的结论?

要更简洁地重新表述:当我们向流发出cudaMemcpy调用时,它会阻止“完整代码”还是阻止它发出的流?

+0

第二个代码片段无效。 'cudaMemcpy'不能接受流号码作为参数,它总是在默认流中提交。 – talonmies 2012-08-16 13:09:09

回答

1

在操作完成之前,同步调用不会将控制权返回给CPU,所以在memcpy完成之前,您的第二个片段甚至不会开始提交内核启动。

您的cudaMemcpy()调用看起来不正确;我不认为你可以指定流参数给任何不以“异步”结尾的memcpy变体。正如所写,编译器可能会接受代码并将流作为memcpy方向。