GPUプログラミング
32×32のfloatの表を共有メモリに置き、ワープの32本で列の方向(縦)に読むとバンク競合が起きる。よく使われる対策はどれか。
- A表を32×32のまま、読む順番をランダムにする
- B共有メモリを使うのをやめ、すべてグローバルメモリから読む
- C表を32×33のように1列余分に確保して、行ごとにバンクの位置をずらす
答えと解説を見る
正解:C. 表を32×33のように1列余分に確保して、行ごとにバンクの位置をずらす
1行が32個のfloat(128バイト)だと、どの行も同じバンクから始まるので、同じ列の要素はすべて同じバンクに入り、縦に読むと32本が1つのバンクに集まります。1行を33個にすると、行が1つ進むたびにバンクが1つずれるので、同じ列の32個がすべて別のバンクに散らばり、1回で読めます。使わない1列分のメモリを足すだけの簡単な工夫です。
- A. ランダムにしても競合は減りません。
- B. グローバルメモリはずっと遅いので逆効果です。
- C. 正しい。詰め物(パディング)で競合をなくします。