検索
連載

第3回 ミスの代償−−2次キャッシュの効用頭脳放談

2次キャッシュがチップ外であることは、Athlonの幾つかある弱点の最たるものであった。しかし、2次キャッシュに、どのくらいの効果があるのだろうか?

Share
Tweet
LINE
Hatena
「頭脳放談」のインデックス

連載目次

2次キャッシュをオン チップ化した新しいAMD Athlon
2次キャッシュをオン チップ化した新しいAMD Athlon
2次キャッシュをオン チップ化したことで性能が向上したAMD Athlon。このプロセッサを見ると、2次キャッシュの効果は大きそうだ。キャッシュには、果たしてどのくらいの効果があるのだろうか。

 ついにAthlonにも2次キャッシュをオン チップ(プロセッサ ダイに2次キャッシュを統合)化したバージョンが出荷された。2次キャッシュがチップ外(プロセッサ モジュール上には載っているが)であることは、Athlonのいくつかある弱点の最たるものであったからまずはめでたい。しかし、2次キャッシュなどというものに、いったいどのくらいの効果があるのだろうか。

 普通、キャッシュというと容量ばかりが取り上げられる。ちょっと知識があると、容量が多ければヒット率が高い、すなわち容量が多いとキャッシュの中に必要なデータがある(キャッシュにヒットする)確率が高いから速いのだ、と説明するかもしれない。でも本当にそうだろうか。今回は、キャッシュの効用について、考えてみたい。なお、説明を簡単にするため、ここではキャッシュのヒット率に計算しやすい値を使用しているが、もちろん実際のプロセッサでの値は、これとは異なる。また、実行するプログラムによっても、キャッシュのヒット率は異なってくることに注意していただきたい。

ヒット率95%はミスが5%あるということ

 ヒット(当たり)があれば、ミス(外れ:キャッシュの中に必要なデータがない)がある。ヒット率95%というと外れは5%、これが宝くじならたいしたもので、ほとんどの人がお金持ちだ。95%も当たるのだから、5%のミスなんてたいしたことはないと思っては、設計者としては失格である。以下のような簡単な計算例を考えてみてほしい。説明を簡単にするため、プロセッサは1クロックあたり1命令実行できるものとする。最近の1GHzのクロック速度であれば、なんと毎秒10億命令も実行できるという想定である。プロセッサには命令のためのキャッシュがあり、1クロックあたり1命令をそのキャッシュから取り出して、パイプライン(1命令の実際の実行に10クロックかかったとしても、1クロックあたり1命令実行しているように見える仕組み。これについては、そのうち説明するつもりだ)に投入していく。

 ここで命令を読み出すためのキャッシュのヒット率を95%と仮定し、ヒットしたときは1クロックの内に読み出せるとしよう。すると、100命令を取り出そうとするとき、95個の命令はキャッシュから1クロックで読み出せるので、95クロックかかることになる。問題は、残りの5個の命令である。この5個はキャッシュ ミスするため、プロセッサの外部にあるメイン メモリから読み出すことになる。このときメイン メモリの速度をきりのよい100MHzとすると、実に1個読み出すのにプロセッサの10クロック分の時間がかかることになる(正確にいえば、100MHzで読み出せるのはある条件下で連続して読み出しているときであり、読み出し始めはもっと時間がかかる)。となると、キャッシュ ミスした命令は5個であるから、5X10で50クロック。言い換えれば、ヒットした95個の命令は95クロックしかかからないのに、ミスした5個の命令には50クロックかかることになる。つまり、ヒット率95%のキャッシュでは、キャッシュとメイン メモリからの命令の読み出しに95+50で145クロックが必要になることが分かる。プロセッサは100命令を100クロックで実行できる性能を持つにもかかわらず、命令の読み出しに145クロックかかるので、プロセッサはその差の45クロックの間、ボーっとしている(業界用語で「ストール」という)ことになる。

命令のキャッシュ ミスにデータのキャッシュ ミスが加わると

  1GHzのプロセッサのはずが、これで実効速度は690MHz(100/145X1GHz)に落ちてしまった。これだけでもショックだろう。金を返せといいたくなるに違いない。さらにショックなのは、これまでの計算は命令用のキャッシュしか考えていない点だ。さらにデータ用のキャッシュも考えてみよう。

 100命令あってもすべての命令がメモリを読み出すわけでないので、とりあえずここでも話を簡単にするため、半分の命令がメモリを読むと仮定する。つまり、100命令のうち50命令がメモリを読む。一般にデータは、命令より参照の局所性(最近使ったものはまた使う確率が高い、また参照したものの近くのものが続けて参照される確率が高い、という原理)が低い。命令とデータが同じ容量なら、ヒット率はデータのほうが低くなりそうだ。そこで、ヒット率を90%と仮定しよう。すると、メモリを読む50命令のうち、45命令がヒットし、5命令が外れる。ヒットした45命令はその命令実行に差し障りがでない(命令は滞りなく実行される)が、外れた5命令はメイン メモリからデータを読み出してくることになる(命令の場合と同様、5命令で5X10で50クロック)。つまり、この間もプロセッサはやることがなくてボーっとしてしまう。

 付け加えていえば、普通のプロセッサはメイン メモリを読む口(「バス」という)は1個しかないので、どちらかのキャッシュのミスでメイン メモリを読み出しているときに、別のキャッシュの読み出しが発生すると、後の読み出しは待たされることになる(2つが並行に進むことはない)。また、前の命令を後の命令が追い越して進行するような仕組みをここでは考慮していないので、命令とデータのどちらがキャッシュ ミスしても、メイン メモリへの読み出しが行われ、その間、プロセッサはボーっとしてしまうことになる。

 ということは、命令のキャッシュ ミスとデータのキャッシュ ミスで起こるプロセッサのボーっとする時間は、命令のキャッシュ ミスの145クロックに、データのキャッシュ ミスの50クロックを足して195クロックにもなる。本来なら100クロックで実行できる筈の100命令の実行に、195クロックと2倍近い時間がかかるわけだ。何と実効周波数は513MHzである。1GHzのプロセッサといっても、これではサギだ。

メイン メモリをすべてキャッシュにしたら?

 この例でキャッシュ ミスの恐ろしさが分かっていただけただろう。プロセッサの速度とメモリ アクセスの速度にギャップがあればあるほど、キャッシュ ミスのペナルティ(損失)は問題になる。ということで、キャッシュのヒット率を向上させればいいのではないか、というのは誰でも気づくことだ。いっそのこと、100%ヒットするように、64Mbytesのメイン メモリをすべてキャッシュ(そうなるともはやキャッシュとは呼べないけれど)にしてしまえばいい、という意見もあるだろう。ところが、ここに立ちはだかるのが、資本主義社会の鉄則、「経済原理」というやつである。実にキャッシュというシステムの理解には、経済学的考察が必要なのであった。ぶっちゃけたところを言えば、速いメモリは値段が高い、遅いメモリは安い、という原則と思っていただければよい。

 何せ半導体屋は不動産屋に似て、面積で商売している。直径20cmばかりの8インチ ウエハーは、都心まで2時間かかり、地価下落のはなはだしい筆者宅近辺の坪単価よりずっーと高そうだ。キャッシュ用の超高速メモリは、そんな高い土地をガバガバと使ってしまうようなものだ。もし、64Mbytesのキャッシュを備えたプロセッサを作るとなると、数万円でも売ることはできないだろう。そこで、単価の高いキャッシュは必要最小限の容量にとどめ、容量が必要なメイン メモリは、遅いけれども面積が小さくてすむ、安価なDRAMで作ることになる。でも、先ほどの例のように、DRAMの速度とプロセッサの速度の差がはなはだしいと、キャッシュ ミスが恐い。せっかくなけなしの金をはたいて買った高速プロセッサの速度が半分になってしまうのでは泣くに泣けない。そこで出てくるのが、2次キャッシュというやつだ。キャッシュを2段構えにして、超高速な1次キャッシュはごくわずかだけ搭載し、まあまあ高速の2次キャッシュをDRAMほどではないけれど1次キャッシュよりはずっと多く搭載する。2次キャッシュは、DRAMほど安くはないが、1次キャッシュよりは安いので、そこそこの容量にとどめておけば、リーズナブルな費用でそれなりに高速なプロセッサができあがる。先ほどの例を使って、2次キャッシュの効果を見てみよう。

2次キャッシュの効能

 先ほどの命令キャッシュとデータ キャッシュを1次キャッシュとして、1次キャッシュとメイン メモリの間に命令、データ兼用の2次キャッシュを置く。2次キャッシュは、1次キャッシュと違い1クロックでは読めないが、メイン メモリのように10クロックもかからない。ここでは、とりあえず2クロックとしてみよう。1次キャッシュよりは容量が多いので、命令とデータの両方ともキャッシュのヒット率を99%とする。すると、先ほどの例では、命令キャッシュでミスした5命令の読み出しに5X10で50クロックもかかっていたが、5命令のうち99%が2次キャッシュにヒットするので、4.95命令までは2クロックで済み、残り0.05命令に10クロックかかることになる。つまり、4.95X2+0.05X10で10.4クロックで済むことになる。データ キャッシュでミスした5命令についても同様である。すると、前の例では195クロックかかっていたのが、115.8クロックで済むことになる。実効周波数は864MHzと大幅に向上する。リーズナブルな値段の2次キャッシュというやつを入れるだけで、実効周波数が513MHzから864MHzになるのだから、これをお買い得と言わずに何と言おう。

2次キャッシュも速度が遅ければ意味がない

 ここで注意しなければならないことがある。2次キャッシュの読み出し速度をとりあえず2クロックと仮定したが、これが3クロックや、4クロックかかるとしたらどうだろう。当然、2次キャッシュの速度が落ちれば、また恐ろしいキャッシュ ミスのペナルティがどんどん増大してくる。オフ チップの(プロセッサのダイに同梱しない)2次キャッシュより、オン チップの(プロセッサのダイに同梱する)2次キャッシュが好ましいのは、このためである。何といっても、いったん半導体の外へ出て、プリント基板の上をノロノロと電気信号が伝わるオフ チップより、オン チップのほうが速度を速くしやすい(ちなみに、オフ チップのころのAthlonでは、プロセッサのクロックが上がるにつれて、2次キャッシュの動作に使うクロックは、プロセッサの1/2から2/5、そして1GHz版では1/3と下がっていた)。

 まぁ、キャッシュというものは、1次にせよ2次にせよ、プロセッサの速度低下を防ぐための装置の一種である。装備したらプロセッサの速度が上がるというものではない。なかなか、プロセッサをあるがままの速度で走らせるのは難しいことなのだ。プロセッサ設計者の仕事の多くは、プロセッサがボーッとしないように工夫すること、と言ってもいいかもしれない。

筆者紹介

Massa POP Izumida

日本では数少ないx86プロセッサのアーキテクト。某米国半導体メーカーで8bitと16bitの、日本のベンチャー企業でx86互換プロセッサの設計に従事する。その後、出版社の半導体事業部を経て、現在は某半導体メーカーでRISCプロセッサを中心とした開発を行っている。


「頭脳放談」のインデックス

頭脳放談

Copyright© Digital Advantage Corp. All Rights Reserved.

ページトップに戻る