多階層キャッシュシステム

このキャッシュシリーズの最初のところで、

という式を掲げた。ここでTは1命令の実行にかかるサイクル数で、命令実行部の実行サイクル数は1.0、メモリアクセス命令の出現頻度は0.3、サイクルタイムを単位としたメインメモリのアクセス時間をtm、同じくキャッシュメモリのアクセス時間をtcとする。そして、hはキャッシュのヒット率である。

この式に、典型的な値として、tm=150、tc=2、h=0.95を代入すると、

となる。これは、プロセサが1命令を実行するのに平均3.82サイクルを必要とし、その内訳としては、実行パイプラインが1.0、キャッシュアクセスが0.57、メインメモリアクセスが2.25サイクルを占めていることを意味している。

このことから、平均命令実行サイクル数を短縮して性能を向上させるには、キャッシュのヒット率hを改善することが有効であることが分かる。また、hが1.0になったとしてもT=1.0+0.6=1.6が限界であり、tcを小さくすることも重要である。

キャッシュのヒット率はプログラムがどのようにメモリをアクセスし、空間や時間的な局所性がどの程度あるかに大きく依存する。また、ダイレクトマップかセットアソシアティブか、入れ替え方式はどうなっているかなどの設計パラメータにも依存する。

キャッシュのヒット率はこれらの多くの要素に依存するため、キャッシュの振る舞いを模擬するキャッシュシミュレータなどを用いてシミュレーションを行わないとヒット率を求めることはできないが、非常に大雑把な目安としては、容量をn倍にすると、ミス率(1-h)は1/SQRT(n)程度に減少する。つまり、前述の例でh=0.95であったキャッシュの容量を倍増すると、ミス率0.05が0.035程度に減少する。そうすると、

となり、この例では、性能は20%程度向上すると見積もられる。

このようにキャッシュのヒット率を高めるためには、キャッシュの容量は大きいほうが良い。しかし、メモリの容量を大きくするとアクセス時間が長くなり、tcが長くなってしまい、ヒット率の改善の効果を相殺してしまう。

このため、多階層のキャッシュという考え方が出てきた。

図4.14 2階層キャッシュメモリ

図4.14のように2階層のキャッシュメモリを持つ構造の場合、平均命令実行サイクルは次のようになる。

ここで、h1は1次キャッシュのヒット率、h2は2次キャッシュのヒット率、tc1は1次キャッシュのアクセス時間、tc2は2次キャッシュのアクセス時間である。

1次キャッシュは小容量としてtc1を1サイクルに短縮し、h1は0.9程度で我慢する。そして、大容量の2次キャッシュを搭載し、h2を0.99、tc2を15サイクルとすると、

となる。

一方、99%のヒット率をもつが、アクセス時間が15サイクルの大容量のメモリを1次キャッシュとして使用する1階層のキャッシュの場合は、T=1.0+4.455+0.45=5.595となり、tcが大きいことから性能は半分以下に留まる。

このように、バランスのとれたメモリシステムを実現するには、多階層のキャッシュ化が必須であり、近年の高性能マイクロプロセサでは、ほぼ例外なく2階層のキャッシュが用いられており、サーバ用プロセサなどでは3次キャッシュを持つ3階層キャッシュを採用している品種も多く見られる。