1

以下のcudaコードを検討してください。

CudaMemCpyAsync(H2d, data1...., StreamA);
KernelB<<<..., StreamB>>>(data1,...);
CudaMemCpyAsync(D2H, output using data1, ...., StreamA);

「CudaMemCpyAsync(D2H .....、StreamA);」はいつですか コードで始まりますか?KernelBの実行終了後に開始しますか?「CudaMemCpyAsync(D2H .....、StreamA);」を置き換えますか?「CudaMemCpy(D2H .....、StreamA);」KernelBの出力をホストにコピーして戻す必要がある場合はどうなりますか?

また、非同期データ転送ではピン留めされたメモリ使用量が絶対に必要ですか?

前もって感謝します。

4

1 に答える 1

3

ユーザーが作成したCUDAストリームは、相互に、およびホストに関して非同期です。同じCUDAストリームに発行されたタスクはシリアル化されます。したがって、あなたの場合、cudaMemCpyAsync(D2H, output using data1, ...., StreamA);前のメモリコピーが終了するのを待ちます。ただし、このメモリコピーが開始されたときに、カーネルが実行を終了したという保証はありません。StreamAStreamBは互いに非同期であるためです。

また、ホストはこれらのストリームの実行が終了するのを待ちません。

ホストにストリームを待機させたい場合は、cudaDeviceSynchronizeまたはを使用できcudaStreamSynchronizeます。

ピン留めされたメモリを使用しない場合、メモリコピーはカーネルの実行と重複しません。

于 2013-02-14T07:46:41.687 に答える