メモリ階層と性能
上のループでintが4バイト、キャッシュラインが64バイト、配列はキャッシュに入っておらず先頭がラインの境界にそろっているとき、プリフェッチがなければ配列の読み込みのミス率はいくらか。
int a[1024];
for (i = 0; i < 1024; i++)
sum += a[i];
- A12.5%
- B6.25%
- 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要素しか使わない飛び飛びのアクセスです。