[解決済み] CUDAにおけるメモリ合体とは何ですか?
質問
CUDAのグローバルメモリトランザクションで、quot;coalesced"とは何でしょうか。CUDAのガイドを読んでもよくわかりませんでした。どうすればいいのでしょうか?CUDAプログラミングガイドの行列の例で、行列の行ごとにアクセスすることを"coalesced"といい、col.ごとにアクセスすることをcoalescedといいますが、どちらが正しいのでしょうか? どちらが正しいですか、またその理由は?
どのように解決するのですか?
この情報は、compute capabality 1.x または cuda 2.0 にのみ適用される可能性があります。最近のアーキテクチャおよび cuda 3.0 は、より洗練されたグローバル メモリ アクセスを備えており、実際、これらのチップでは合体グローバル負荷はプロファイリングさえされていません。
また、このロジックはバンクの競合を回避するために共有メモリに適用することができます。
coalesced memory transaction は、ハーフワープ内のすべてのスレッドが同時にグローバルメモリにアクセスするものです。これは単純すぎますが、正しい方法は、連続したスレッドが連続したメモリ アドレスにアクセスするだけです。
つまり、スレッド 0、1、2、3 がグローバル メモリ 0x0、0x4、0x8、0xc を読み込む場合、それは coalesced リードであるべきです。
行列の例では、行列がメモリ内に線形に存在するようにすることに留意してください。これはどのようにでも行うことができ、メモリ アクセスは行列がどのようにレイアウトされるかを反映する必要があります。つまり、以下の 3x4 の行列は
0 1 2 3
4 5 6 7
8 9 a b
は、次のように、行の後に行うことができ、 (r,c) はメモリ (r*4 + c) に対応するようになります。
0 1 2 3 4 5 6 7 8 9 a b
要素に一度だけアクセスする必要があり、4つのスレッドがあるとします。どのスレッドがどの要素に使われるのでしょうか?おそらく
thread 0: 0, 1, 2
thread 1: 3, 4, 5
thread 2: 6, 7, 8
thread 3: 9, a, b
または
thread 0: 0, 4, 8
thread 1: 1, 5, 9
thread 2: 2, 6, a
thread 3: 3, 7, b
どちらがよいのでしょうか?どちらがコアレスリードになり、どちらがならないのでしょうか?
いずれにせよ、各スレッドは3回アクセスします。最初のアクセスを見て、スレッドが連続してメモリにアクセスするかどうかを確認しましょう。最初の選択肢では、最初のアクセスは 0, 3, 6, 9 です。連続でも合体でもありません。2番目のオプションでは、0, 1, 2, 3です。連続! Coalesced! やったー!
最良の方法は、おそらくカーネルを書き、それをプロファイルして、グローバルロードとストアが非合理化されているかどうかを確認することでしょう。
関連
-
CUDAのcudaMalloc()のパラメータを理解する方法
-
MatlabからCUDAへの呼び出しの概要(Windows, Ubuntu)
-
cudaMemcpyとcudaMemcpyAsyncの違い
-
[解決済み] バンクコンフリクトとは何ですか?(Cuda/OpenCLのプログラミングをする)
-
[解決済み] CUDAバージョンの取得方法を教えてください。
-
CUDA (V) deviceQueryを使ったGPUのプロパティ
-
[解決済み】定義と宣言の違いは何ですか?
-
[解決済み】DockerコンテナからGPUを使用する?
-
[解決済み] CUDAのグリッド寸法、ブロック寸法、スレッド構成を理解する(簡単な説明)【終了しました。
-
[解決済み] ストリーミングマルチプロセッサ、ブロックとスレッド(CUDA)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
CUDAドライバのバージョンが、CUDAランタイムのバージョンに対して不足している問題
-
cudaMallocとcudaMallocPitchの秘密を教えます。
-
MatlabからCUDAへの呼び出しの概要(Windows, Ubuntu)
-
CUDAアトミック操作
-
CUDA プログラミングのエラー処理
-
CUDA (V) deviceQueryを使ったGPUのプロパティ
-
[解決済み] nvccとNVIDIA-smiが示す異なるCUDAのバージョン
-
[解決済み] グローバル機能とデバイス機能の違い
-
[解決済み] NVIDIAとAMDの比較:GPGPUパフォーマンス
-
[解決済み] nvidia-smi Volatile GPU-Utilization の説明?