コードの 2 つのスニペットについて考えてみましょう。
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 同期)
コマンドは 2 つの異なるストリームに対して発行されているため、私の理解では、両方のケースで重複する可能性があります。
しかし、Snippet2 では cudaMemcpy 呼び出しが同期的 (つまりブロッキング) であるため、cudaMemcpy とカーネル呼び出しが次々に実行されるという逆説的な結論に至ります。
結論として正しいのはどれか。
よりコンパクトに言い換えると、ストリームに cudaMemcpy 呼び出しを発行すると、「コード全体」がブロックされますか、それとも発行先のストリームがブロックされるだけですか?