キャッシュと主記憶を合わせた平均的なメモリアクセス時間
実効アクセス時間(effective access time)とは、キャッシュと主記憶を組み合わせたときに、1回のメモリアクセスで平均どれくらいの時間がかかるかを表す値です。「平均アクセス時間」とも呼ばれます。
メモリアクセスには2つのパターンがあります。ヒットのときは速いキャッシュ時間だけで済み、ミスのときは遅い主記憶時間がかかります。実際にはこの2つが混ざって起きるので、それぞれの起こりやすさ(ヒット率・ミス率)で重みづけした平均を取ったものが実効アクセス時間です。
身近な例で考えると、通勤時間の平均に似ています。晴れの日(ヒット)は10分、雨の日(ミス)は道が混んで100分かかるとします。晴れが9割・雨が1割なら、平均の通勤時間は「10分×0.9 + 100分×0.1 = 19分」。毎日きっかり19分ではありませんが、長い目で見た平均がこの値になります。上のツールでスライダーを動かすと、各値の変化に実効アクセス時間が連動するのが分かります。
実効アクセス時間は、「ヒットしたときの時間」と「ミスしたときの時間」を、それぞれの確率で重みづけして足し合わせることで求めます。
実効時間 = ヒット率 × キャッシュ時間
+ (1−ヒット率) × 主記憶時間
式の各項の意味は次の通りです。
・ヒット率 × キャッシュ時間:ヒットしたときにかかる時間ぶんの重み(ヒット項)
・(1−ヒット率) × 主記憶時間:ミスしたときにかかる時間ぶんの重み(ミス項)。「(1−ヒット率)」がミス率
・この2つを足したものが、平均1回あたりのアクセス時間
ここで大切なのは、ヒット率が高いほど実効時間が短くなるという関係です。ヒット率を上げると、遅い主記憶時間が掛かるミス項の比重が小さくなり、速いキャッシュ時間に近づいていきます。上のツールのバーで、ヒット項(緑)とミス項(赤)の割合がヒット率に応じて変わる様子を確認してください。
なお、ミスのときの時間を「キャッシュ時間 + 主記憶時間」とする(まずキャッシュを調べてから主記憶に行く、と考える)流儀もあります。問題文でミス時の時間がどう定義されているかを確認するのが確実です。このツールでは、ミス時は主記憶時間だけがかかるという基本の式を使っています。
ヒット率が上がるほど実効アクセス時間は短くなります。しかしその効果は「均等」ではなく、ヒット率が高い領域でさらに上げるほど劇的に短くなるという特徴があります。上のグラフで確認してみましょう(キャッシュ10ns・主記憶100nsの場合)。
計算例と実効時間をまとめます。
・ヒット率50%:0.5×10 + 0.5×100 = 55 ns(主記憶そのものの半分程度にしかなっていない)
・ヒット率80%:0.8×10 + 0.2×100 = 28 ns
・ヒット率90%:0.9×10 + 0.1×100 = 19 ns
・ヒット率99%:0.99×10 + 0.01×100 = 10.9 ns(ほぼキャッシュ速度)
なぜこうなるか。ミス項 (1−ヒット率) × 100 が実効時間を大きく引き上げる「重石」になっているからです。ヒット率が50%だとミス項だけで50nsもあります。ヒット率を90%に上げると、ミス項は10nsにまで減ります。遅い主記憶が引っ張る力を減らすことが、実効アクセス時間を短縮する本質です。上のツールのスライダーでヒット率を変えながら確認してみてください。
実効アクセス時間の計算が成り立つ前提として、キャッシュが実際に高いヒット率を達成できることが重要です。なぜ小さなキャッシュで高いヒット率を保てるのでしょうか?それは、プログラムが参照するデータに偏り(局所性)があるからです。
局所性には2種類あります。
・時間的局所性:一度アクセスしたデータは、近いうちにまた使われやすいという性質。例えばループの中で同じ変数を何度も読み書きする
・空間的局所性:あるデータにアクセスすると、その近くのデータも使われやすいという性質。例えば配列を先頭から順番にアクセスする
身近な例で言うと、机の引き出し(キャッシュ)に最近使った書類だけを入れておくイメージです。「最近使ったものはすぐまた使う」という習慣(時間的局所性)と「関連書類はまとめて使う」という習慣(空間的局所性)があるおかげで、大きな書庫(主記憶)まで行かなくても机の引き出しだけで仕事が片付くことがほとんどです。この偏りのおかげで、キャッシュは90%以上という高いヒット率を達成でき、実効アクセス時間を大幅に短縮できます。
実際に値を当てはめて計算してみましょう。ヒット率90%、キャッシュ時間10ns、主記憶時間100nsのときの実効アクセス時間を求めます。
実効時間 = 0.9 × 10 + 0.1 × 100
= 9 + 10
= 19 ns
キャッシュが無ければ毎回100nsかかるところ、ヒット率90%のキャッシュがあるおかげで平均19nsまで短縮できました。約5分の1です。続いて、ヒット率を95%に上げるとどうなるか見てみましょう。
実効時間 = 0.95 × 10 + 0.05 × 100
= 9.5 + 5
= 14.5 ns
ヒット率をわずか5ポイント上げただけで、19ns から 14.5ns へと大きく短縮されました。ミス項(遅い主記憶時間)の比重が減ったためです。ヒット率の改善が実効アクセス時間に与える効果は大きいことが分かります。上のツールの「プリセット」からこれらの条件を選び、計算ステップとバーの内訳を見比べてみてください。