GPUプログラミング

32×32のfloatの表を共有メモリに置き、ワープの32本で列の方向(縦)に読むとバンク競合が起きる。よく使われる対策はどれか。

  1. A表を32×32のまま、読む順番をランダムにする
  2. B共有メモリを使うのをやめ、すべてグローバルメモリから読む
  3. C表を32×33のように1列余分に確保して、行ごとにバンクの位置をずらす
答えと解説を見る

正解:C. 表を32×33のように1列余分に確保して、行ごとにバンクの位置をずらす

1行が32個のfloat(128バイト)だと、どの行も同じバンクから始まるので、同じ列の要素はすべて同じバンクに入り、縦に読むと32本が1つのバンクに集まります。1行を33個にすると、行が1つ進むたびにバンクが1つずれるので、同じ列の32個がすべて別のバンクに散らばり、1回で読めます。使わない1列分のメモリを足すだけの簡単な工夫です。

  • A. ランダムにしても競合は減りません。
  • B. グローバルメモリはずっと遅いので逆効果です。
  • C. 正しい。詰め物(パディング)で競合をなくします。
この分野を解く 分野ページへ

GPUプログラミングのほかの問題

  1. GPUで大きな行列の積を計算するとき、行列を小さなタイルに分けて共有メモリに読み込む理由として正しいものはどれか。
  2. GPUのカーネルで、1スレッドあたりのレジスタの使用量が多すぎると起こりうることとして正しいものはどれか。
  3. GPUの占有率(オキュパンシー)の説明として正しいものはどれか。
  4. GPUがメモリの長い遅延(数百クロック)を隠す主な方法として正しいものはどれか。
  5. GPUの占有率について正しいものはどれか。