考虑这两个代码片段。
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 调用时,它会阻塞“整个代码”还是只是阻塞发出它的流?