メモリ階層と性能

上のようにx座標だけを合計する処理を、配列の構造体(各成分を別々の配列にする形)に書き換えると速くなりやすい理由はどれか。

struct P { float x, y, z, mass; };
struct P p[N];
for (i = 0; i < N; i++)
    sx += p[i].x;
  1. A構造体の配列のままだと、コンパイラがxだけを読み出す命令を作れないから
  2. B別々の配列にすると、浮動小数点の計算がより高い精度になるから
  3. Cxだけが連続して並び、読み込んだラインに不要な成分が混ざらないから
答えと解説を見る

正解:C. xだけが連続して並び、読み込んだラインに不要な成分が混ざらないから

構造体の配列(AoS)では、x・y・z・massの16バイトが1組で並ぶので、xだけを読む処理でも64バイトのラインの4分の3は使わないデータになります。各成分を別々の配列(SoA)にすればxだけが連続して並び、読み込んだラインをすべて使えて、メモリの通信量が約4分の1になります。SIMDによるベクトル化もしやすくなります。AoSでもxを読む命令は作れ、配列の形を変えても計算の精度は変わりません。

  • A. AoSでもxを読む命令は普通に作れます。
  • B. データの並べ方を変えても計算の精度は変わりません。
  • C. 正しい。必要なxだけが連続し、ラインを無駄なく使えます。
この分野を解く 分野ページへ

メモリ階層と性能のほかの問題

  1. キャッシュを命令用(Iキャッシュ)とデータ用(Dキャッシュ)に分けたL1キャッシュの主な利点はどれか。
  2. ページサイズ4 KB、ラインサイズ64バイトのシステムで、L1キャッシュを仮想インデックス・物理タグ(VIPT)方式にし、インデックスとオフセットをページ内のビットだけで構成したい。8ウェイ・セットアソシアティブなら、キャッシュの容量は最大いくらにできるか。
  3. L1キャッシュに仮想インデックス・物理タグ(VIPT)方式がよく使われる主な理由はどれか。
  4. キャッシュのヒット時間が2サイクル、ミス率が4%、ミスペナルティが150サイクルのとき、平均メモリアクセス時間は何サイクルか。
  5. キャッシュが理想的なら平均CPIが1.0のプロセッサで、1命令あたり平均1.3回のメモリアクセスがあり、そのミス率が2%、ミスペナルティが100サイクルのとき、実際の平均CPIはいくらか。