FE EXAM

実効アクセス時間(平均アクセス時間)

キャッシュと主記憶を合わせた平均的なメモリアクセス時間

INTERACTIVE VISUALIZATION
ヒット項
ミス項
ヒット率 / ミス率
90% / 10%
キャッシュ / 主記憶
10 / 100 ns
実効アクセス時間
19 ns
ヒット率90%
0%100%
キャッシュ時間10 ns
150
主記憶時間100 ns
10300
プリセット
計算ステップ
実効時間 = ヒット率 × キャッシュ時間 + (1−ヒット率) × 主記憶時間
= 0.9 × 10 + 0.1 × 100
= 9 + 10
= 19 ns
実効時間の内訳(ヒット項 + ミス項)
9 nsヒット項
10 nsミス項
合計(実効アクセス時間)19 ns
ヒット率が高いほど速いキャッシュ時間の比重が増え、実効時間が短くなります。逆にミスが増えると遅い主記憶時間が効いてきて実効時間が伸びます。スライダーを動かして変化を確かめてください。
解説

📌
実効アクセス時間とは

速いキャッシュと遅い主記憶の「平均」キャッシュ 10nsたいてい命中主記憶 100nsたまに必要平均 ≒ 19ns(ヒット率90%)

実効アクセス時間(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%55 ns80%28 ns90%19 ns99%10.9 ns■ヒット項■ミス項

ヒット率が上がるほど実効アクセス時間は短くなります。しかしその効果は「均等」ではなく、ヒット率が高い領域でさらに上げるほど劇的に短くなるという特徴があります。上のグラフで確認してみましょう(キャッシュ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つの性質でキャッシュが高いヒット率を保てる

実効アクセス時間の計算が成り立つ前提として、キャッシュが実際に高いヒット率を達成できることが重要です。なぜ小さなキャッシュで高いヒット率を保てるのでしょうか?それは、プログラムが参照するデータに偏り(局所性)があるからです。

局所性には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 へと大きく短縮されました。ミス項(遅い主記憶時間)の比重が減ったためです。ヒット率の改善が実効アクセス時間に与える効果は大きいことが分かります。上のツールの「プリセット」からこれらの条件を選び、計算ステップとバーの内訳を見比べてみてください。

関連コンテンツ