本連載はHisa Ando氏による連載「コンピュータアーキテクチャ」の初掲載(2005年9月20日掲載)から第72回(2007年3月31日掲載)までの原稿を再掲載したものとなります。第73回以降、最新のものにつきましては、コチラにて、ご確認ください。

前回で述べたように、全体のCPIを小さくするためには、キャッシュミス率を低減することと、待ち時間のTm*を減らすことが重要である。

一般的にキャッシュの容量を大きくすればミス率は減少するが、大きなキャッシュはチップ面積を喰うし、アクセス速度も遅くなる。キャッシュ容量とミス率の関係は、プログラムがどのようなメモリアクセスをするかによるので千差万別であるが、多くの場合、容量を2倍にしてもミス率は半分にはならず、2割~3割減少する程度であり、どの程度の容量のキャッシュを搭載するかにはチップ面積、速度と性能向上のトレードオフが存在する。

一般的に巨大なデータを扱うビジネス系のアプリケーションではキャッシュミス率が高く、サーバ用のプロセサであるXeonやItanium 2 などでは大きな2次、3次キャッシュを搭載するが、デスクトップ系のプロセサでは扱うデータサイズも小さいので、チップサイズを小さく抑えてコストを下げるために、サーバ用のプロセサよりも小さめのキャッシュが使われる傾向にある。

また、キャッシュミス率は、容量だけでなく、例えば、同一容量であればフルアソシアティブ方式が一番小さく、ダイレクトマップが一番大きいというように方式によっても違う。キャッシュラインサイズを大きくすると、タグの量が減りハードウェアは削減できるが、一つのキャッシュラインの一部しか使われないので、総容量を一定とするとミス率は高くなる傾向がある。

このように、一般にミス率が減る方式はタグアレイや比較回路が多く必要となるなどのデメリットがあり、使えるハードウェア量や電力とミス率のトレードオフとなる。更に、ミス率は、LRUなどの入れ替え方式やコヒーレンシ制御方式にも依存するというように各種の設計上の選択に依存する。

DRAMのアクセス速度はほぼ一定であるのに対して、CPUクロックが向上すると、CPUサイクルで数えたDRAMアクセス時間はクロック周波数に比例して大きくなってしまう。このため、クロック周波数の向上につれて、前回に述べたCPIの式ではm2を小さく抑えるために2次キャッシュ(一般的にはメモリに最も近いキャッシュ)の容量を増加させる傾向にある。このため、Intelの次期Itanium 2プロセサ(Montecito)では24MBの3次キャッシュを内蔵し、IBMのPOWER5プロセサではDRAM内蔵の外付けキャッシュチップにより36MBの3次キャッシュを持たせている。

このような大容量のキャッシュを2次キャッシュとしてコアに直結すると、2次キャッシュのアクセス待ち時間が大きく、1次キャッシュをミスした場合のCPIが大きくなってしまう。このため、大容量のキャッシュは3次キャッシュとし、中間に2次キャッシュを挟む3階層のキャッシュが用いられる。

  • 中容量2次キャッシュを介して巨大3次キャッシュを接続した構成

    中容量2次キャッシュを介して巨大3次キャッシュを接続した構成

この図に使用したミス率やアクセスに必要なサイクル数は一例であるが、巨大2次キャッシュを直結した場合のCPIは2.8~4.6であるのに対して、巨大キャッシュを3次キャッシュとして中規模の2次キャッシュを介して接続する構成とすることにより、CPIを2.5~3.8とし、性能を10~20%改善することができる。

一般的に、多階層のキャッシュを作る場合は、各階層のキャッシュで10倍程度に容量を大きくしてゆくのが目安と言われた時代もあったが、最近ではシミュレータを使って各種のアプリケーションプログラムを実行させてみて、コストとのトレードオフで最も効果的と考えられる構成を採用しているようである。

ここで、Pentium 4もどきの16KBの1次キャッシュを持つプロセサとAthlon 64もどきの64KBの1次キャッシュを持ったプロセサがあるとする。Pentium 4もどきのクロックは3GHz、Athlon 64もどきのクロックは2GHzで、あるアプリケーションでの1次キャッシュのミス率が16KBの場合は10%、64KBの場合は半分の5%とする。そして、1次キャッシュをミスして2次キャッシュにアクセスする時間(2次キャッシュをミスしてメモリにアクセスするケースも含んだ平均アクセス時間)を3ns、プロセサコアのCPIは0.7で両者同じとすると、どちらが速いのであろうか?

Pentium 4もどきは1次キャッシュをミスすると下位のメモリをアクセスするのに9サイクル掛り、ミス率が10%であるのでこの部分のCPIが0.9となり、コアの0.7と合わせて全体のCPIは1.6となる。一方、Athlon 64もどきはクロックが遅いので、下位のメモリアクセスは6サイクルであり、5%のミス率であるのでCPIは0.3となる。これにコアの0.7を足して全体のCPIは1.0である。

実時間で比べると、Pentium 4もどきはサイクルタイムが0.33nsであり、1.6CPIということは0.53nsで平均的に1命令を実行できる。一方、Athlon 64もどきはサイクルタイムが0.5nsであり、平均命令実行時間は0.5nsとなり、クロック周波数は2/3であるが、Pentium 4もどきより若干速いことになる。

別に筆者はAMDの肩をもつわけではないが、このようなケースではコアが全く同じCPIで、クロックが1.5倍でも、1次キャッシュのミス率の違いで実効性能は逆転することがあり得るのである。そして、これだけが原因ではないが、1次キャッシュの容量が大きくミス率が低いことが、クロックが2/3程度でもAMDのプロセサがPentium 4と太刀打ちできる性能を実現できている理由の一つである。