GPUプログラミング
GPUで画素の値のヒストグラムを作るとき、全スレッドがグローバルメモリの256個のビンにatomicAddで直接足すと遅いことがある。改善の方法として正しいものはどれか。
- AatomicAddをやめて、普通の足し算でグローバルメモリに書く
- Bビンの数を1つにまとめる
- Cブロックごとに共有メモリで部分的なヒストグラムを作り、最後にグローバルメモリのビンへまとめて足す
答えと解説を見る
正解:C. ブロックごとに共有メモリで部分的なヒストグラムを作り、最後にグローバルメモリのビンへまとめて足す
多数のスレッドが同じビンに同時にatomicAddを行うと、更新が1つずつ順番に処理され、しかもグローバルメモリは遅いので待ちが長くなります。各ブロックが共有メモリに自分用のヒストグラムを持ち、そこで数えてから最後に1回だけグローバルに足せば、遅いメモリでの競合はブロックの数×ビンの数の回数に減ります。共有メモリでのアトミック演算はずっと速く行えます。
- A. データ競合で数が失われます。
- B. ヒストグラムの意味がなくなります。
- C. 正しい。遅いグローバルメモリでの競合が大きく減ります。