GPUプログラミング
GPUで大きな行列を転置する(b[j][i] = a[i][j])とき、共有メモリを経由させる主な目的はどれか。
- A転置の計算の回数を半分にするため
- B行列の値を共有メモリで並べ替えて、小さい順にするため
- Cタイルを行の方向に合体アクセスで読み込み、共有メモリの中で向きを変えて、書き込みも合体アクセスにするため
答えと解説を見る
正解:C. タイルを行の方向に合体アクセスで読み込み、共有メモリの中で向きを変えて、書き込みも合体アクセスにするため
素朴に書くと、aを行の方向に読めば合体アクセスになりますが、bへの書き込みは列の方向になり、番地がとびとびになって遅くなります。タイルを共有メモリに読み込んでから、スレッドの担当を入れ替えて読み出せば、グローバルメモリへの読みも書きも続いた番地にできます。このとき共有メモリの列方向の読み出しでバンク競合が起きないよう、1列余分に確保する工夫も組み合わせます。
- A. 転置は値を移すだけで、計算の回数の問題ではありません。
- B. 値を並べ替える(ソートする)わけではありません。
- C. 正しい。読みと書きの両方を続いた番地にします。