GPUプログラミング

GPUで画素の値のヒストグラムを作るとき、全スレッドがグローバルメモリの256個のビンにatomicAddで直接足すと遅いことがある。改善の方法として正しいものはどれか。

  1. AatomicAddをやめて、普通の足し算でグローバルメモリに書く
  2. Bビンの数を1つにまとめる
  3. Cブロックごとに共有メモリで部分的なヒストグラムを作り、最後にグローバルメモリのビンへまとめて足す
答えと解説を見る

正解:C. ブロックごとに共有メモリで部分的なヒストグラムを作り、最後にグローバルメモリのビンへまとめて足す

多数のスレッドが同じビンに同時にatomicAddを行うと、更新が1つずつ順番に処理され、しかもグローバルメモリは遅いので待ちが長くなります。各ブロックが共有メモリに自分用のヒストグラムを持ち、そこで数えてから最後に1回だけグローバルに足せば、遅いメモリでの競合はブロックの数×ビンの数の回数に減ります。共有メモリでのアトミック演算はずっと速く行えます。

  • A. データ競合で数が失われます。
  • B. ヒストグラムの意味がなくなります。
  • C. 正しい。遅いグローバルメモリでの競合が大きく減ります。
この分野を解く 分野ページへ

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

  1. GPUで多数の値の総和を求めるとき、木の形のリダクション(隣どうしを足して半分にすることを繰り返す)を使う理由として正しいものはどれか。
  2. 1024個の値を木の形のリダクションで合計するとき、必要な段の数はいくつか。
  3. 単体のGPUを使うプログラムで、CPU側のメモリとGPU側のメモリについて一般的に正しいものはどれか。
  4. 配列の要素を1回だけ足し算するような軽い処理のためにデータをGPUへ送ると、CPUで計算するより遅くなることがある。主な理由はどれか。
  5. CPUのメモリをピン留め(ページロック)してからGPUへ転送すると速くなる理由として正しいものはどれか。