コピーと計算をオーバーラップさせる
カーネルの背後に転送処理を隠します。
「コピーと計算をオーバーラップさせる」はCoddyKit上の無料CUDA Academyレッスンです。 これはレッスン4/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはCUDA Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 CUDA Academyコースには全4レッスンが含まれています。
重要な考え方
本当の高速化は、2 つの処理を同時に行うことで実現します。つまり、GPU が別のデータチャンクを計算している間に、1 つのチャンクをコピーします。🔀
分離されたハードウェアエンジン
GPU には、個別のコピーエンジンと計算ユニットがあります。これらが交互ではなく本当に並列で動作できるため、処理を重ね合わせられます。
ページ固定メモリが必要
非同期コピーには、cudaMallocHost で確保したページ固定ホストメモリが必要です。通常のページング可能な malloc ではブロッキングコピーが強制され、重ね合わせられません。
cudaMallocHost(&h_data, bytes);非同期コピー
ストリームとともに cudaMemcpyAsync を使うと、転送はすぐに戻り、カーネルと同じストリームのキューに入ります。
cudaMemcpyAsync(d_in, h_in, bytes, cudaMemcpyHostToDevice, s);処理をチャンクに分割する
配列を複数の部分に分け、それぞれを専用のストリームに割り当てます。stream 0 が計算している間に、stream 1 はすでにコピーを開始できます。
コピー、計算、コピー戻し
各チャンクは、自分のストリームで同じ 3 つの手順を実行します。入力をアップロードし、カーネルを実行し、出力をダウンロードします。ホストはブロックされません。
cudaMemcpyAsync(d, h, n, H2D, s);
k<<<g, b, 0, s>>>(d);
cudaMemcpyAsync(h, d, n, D2H, s);重ね合わせが形成される仕組み
チャンクが異なるストリームに存在するため、GPU はチャンク 1 の計算中にチャンク 2 をコピーできます。タイムラインが埋まっていきます。📊
PCIe のコストを隠す
転送時間はもはや総時間に加算されず、計算処理の背後に隠れます。理想的には、実行時間はコピー時間とカーネル時間の長い方に近づきます。
デフォルトストリームに注意する
ループの途中にデフォルトストリームを使う呼び出しが 1 つでもあると、すべてが再び直列化される可能性があります。すべての非同期処理を、実際の非デフォルトストリームに関連付けてください。
プロファイラーで確認する
Nsight Systems を開き、コピーと計算のレーンが時間的に重なっているか確認します。レーンが積み重なってビジーになっていれば、並行性が実際に発揮されています。
最後に同期する
すべてのチャンクを発行したら、cudaDeviceSynchronize を 1 回呼び出し、ホストで最終結果を読み取る前にすべてのストリームを完了させます。
cudaDeviceSynchronize();理解度チェック
非同期転送を計算と重ね合わせるには、何が必要でしょうか。
まとめ
ページ固定メモリと非同期コピーを使い、処理をストリーム間でチャンクに分けることで、転送を計算の背後に隠し、GPU を本当に稼働させ続けられます。🚀
よくある質問
「コピーと計算をオーバーラップさせる」レッスンは無料ですか?
はい。「コピーと計算をオーバーラップさせる」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、CUDA Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 CUDA Academyコースには全4レッスンが含まれています。
「コピーと計算をオーバーラップさせる」で何を学びますか?
カーネルの背後に転送処理を隠します。 ブラウザで直接実行するハンズオンコードでCUDA Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
CUDA Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのCUDA Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン4/4です。
「コピーと計算をオーバーラップさせる」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このCUDA Academyレッスンでコードを書いて実行できますか?
はい。すべてのCUDA Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- デフォルトストリームの落とし穴
- ストリームを作成して使う
- 計測と同期にイベントを使う
- コピーと計算をオーバーラップさせる