GPUプログラミング
粒子の位置x、y、zを持つデータをGPUで処理するとき、メモリ合体アクセスの点で有利な並べ方はどれか。
- A粒子ごとにx、y、zを並べた構造体の配列にする
- Bすべての値をランダムな順番に並べる
- Cxだけの配列、yだけの配列、zだけの配列に分ける(構造体の配列ではなく、配列の構造体)
答えと解説を見る
正解:C. xだけの配列、yだけの配列、zだけの配列に分ける(構造体の配列ではなく、配列の構造体)
構造体の配列(AoS)では、粒子0のx・y・z、粒子1のx・y・z…と並ぶので、各スレッドがxを読むと番地が12バイトずつとびとびになります。配列の構造体(SoA)にしてxだけを続けて並べると、隣り合うスレッドが隣り合う番地のxを読むので合体アクセスになります。CPUのSIMDでも同じ理由でSoAが有利なことが多いです。
- A. 隣のスレッドのxが12バイトずつ離れてしまいます。
- B. 合体アクセスにならなくなります。
- C. 正しい。同じ成分を読むスレッドの番地が続きます。