メモリ階層と性能

上のループでintが4バイト、キャッシュラインが64バイト、配列はキャッシュに入っておらず先頭がラインの境界にそろっているとき、プリフェッチがなければ配列の読み込みのミス率はいくらか。

int a[1024];
for (i = 0; i < 1024; i++)
    sum += a[i];
  1. A12.5%
  2. B6.25%
  3. C100%
答えと解説を見る

正解:B. 6.25%

64バイトのラインには 64 ÷ 4 = 16個のintが入ります。順に読むと、各ラインの最初の要素で1回ミスし、残りの15個はヒットするので、ミス率は 1 ÷ 16 = 6.25%です。1024個なら 1024 ÷ 16 = 64回のミスになります。12.5%は1ラインに8個しか入らないと誤った場合の値です。100%になるのは16個おき(64バイトおき)に読むように、ラインごとに1要素しか使わないアクセスのときです。

  • A. 12.5%は1ラインに8要素と誤った場合の値です。
  • B. 正しい。16要素ごとに1回ミスするので1/16 = 6.25%です。
  • C. 100%になるのは、ラインごとに1要素しか使わない飛び飛びのアクセスです。
この分野を解く 分野ページへ

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

  1. 行列の積などで使われるループブロッキング(タイリング)の主な目的はどれか。
  2. 上のようにx座標だけを合計する処理を、配列の構造体(各成分を別々の配列にする形)に書き換えると速くなりやすい理由はどれか。
  3. キャッシュを命令用(Iキャッシュ)とデータ用(Dキャッシュ)に分けたL1キャッシュの主な利点はどれか。
  4. ページサイズ4 KB、ラインサイズ64バイトのシステムで、L1キャッシュを仮想インデックス・物理タグ(VIPT)方式にし、インデックスとオフセットをページ内のビットだけで構成したい。8ウェイ・セットアソシアティブなら、キャッシュの容量は最大いくらにできるか。
  5. L1キャッシュに仮想インデックス・物理タグ(VIPT)方式がよく使われる主な理由はどれか。