「CUDA C プログラミング ガイド」の CUDA の「データ転送とカーネル実行のオーバーラップ」セクションを読んだ後、質問があります。データ転送とは正確には何を指すのでしょうか?
cudaMemsetAsync
、cudaMemcpyAsync
、cudaMemset
、が含まれていますかcudaMemcpy
。もちろん、memcpy に割り当てられたメモリは固定されます。暗黙の同期 (ストリーム) セクションでは、本は「デバイス メモリ セット」がストリームをシリアル化する可能性があると述べています。
cudaMemsetAsync
それで、それはcudaMemcpyAsync
、、、、cudaMemcpy
を指しcudaMemcpy
ますか?私はわかりません。
1 に答える
最後にを持つ関数呼び出しにAsync
は、ストリーム パラメーターがあります。さらに、CUDA ツールキットによって提供される一部のライブラリには、ストリームを設定するオプションもあります。これを使用すると、複数のストリームを同時に実行できます。
つまり、特にストリームを作成して設定しない限り、デフォルトのストリームを使用することになります。たとえば、デフォルトdata transfer
とkernel execution
ストリームはありません。2 つ (またはそれ以上) のストリームを作成し、選択したタスクを割り当てる必要があります。
一般的な使用例は、プログラミング ガイドに記載されているように 2 つのストリームを使用することです。これは、複数のカーネルを起動している場合にのみ役立つことに注意してください。現在のカーネルの結果を計算しながら、次の (独立した) カーネルまたは現在のカーネルの次の反復に必要なデータを取得できます。これにより、計算能力と帯域幅能力の両方を最大化できます。
あなたが言及した関数呼び出しについては、cudaMemcpy
データcudaMemcpyAsync
転送を実行する唯一の関数です。cudaMemset
データ転送とcudaMemsetAsync
は呼べないと思います。
cudaMempyAsync
とは両方ともcudaMemsetAsync
ストリームで使用できますが、cudaMemset
とcudaMemcpy
はストリームを使用しない呼び出しをブロックしています。