GPUプログラミング
各スレッドの番号をiとして、上のように32要素おきに配列を読むと、a[i]を読む場合に比べて遅くなる。主な理由はどれか。
float x = a[i * 32];
- A隣のスレッドの番地が128バイト離れるので合体アクセスにならず、スレッドごとに別のメモリのまとまりを読むことになるから
- B掛け算の計算に時間がかかるから
- C32要素おきに読むと、値が正しく読めないから
答えと解説を見る
正解:A. 隣のスレッドの番地が128バイト離れるので合体アクセスにならず、スレッドごとに別のメモリのまとまりを読むことになるから
floatは4バイトなので、a[i*32]では隣のスレッドの番地が128バイト離れます。ワープの32本は32個の別々のまとまりを読み、それぞれのまとまりから4バイトしか使いません。a[i]なら32本で128バイトの1つのまとまりで済むので、運ぶデータの量に何十倍もの差が出ます。2次元の配列では、スレッドの番号を内側(続いた番地)の添字に対応させるのが基本です。
- A. 正しい。読んだまとまりの大部分が使われません。
- B. 掛け算の時間は、メモリの待ちに比べて小さいです。
- C. 値は正しく読めますが、遅くなります。