本連載はHisa Ando氏による連載「コンピュータアーキテクチャ」の初掲載(2005年9月20日掲載)から第72回(2007年3月31日掲載)までの原稿を再掲載したものとなります。第73回以降、最新のものにつきましては、コチラにて、ご確認ください。
図11は2005年の秋のIntel Developer ForumでのMerom / Conroe / Woodcrestという次世代プロセサの発表スライドのコピーである。
この3番目がキャッシュに関するエンハンスについて述べており、次世代プロセサでは2次キャッシュ(L2 Cache)が2コアで共通になり、かつ、Scalableになる。また、1次キャッシュ間の直接転送、2次キャッシュとコア間の転送バンド幅が向上していると書かれている。
Shared L2 CacheはYonahと同じでありMeromの新機能というわけではないが、こちらはScalableという形容が追加されている。モバイルのMeromからサーバ用のWoodcrestまで基本的には同じコアで2次キャッシュの違いで差を付けると言われているので、用途や性能に応じてスケールできるということを述べているのかと思うが、具体的な内容は明らかではない。
2次キャッシュとコアの転送バンド幅の強化は理解できるが、1次キャッシュ間の直接転送が判らない。相手方のコアの1次キャッシュも同時にアクセスできると書いた報道もあるが、自コアの1次キャッシュと完全に同等にアクセスできるとなると、2次キャッシュではなく1次キャッシュを共用する構造になってしまう。1次キャッシュはアクセス頻度が高いので、2コアからのアクセスをサポートするのはコストが高い。また、このスライドのチップ写真が本物かどうかわからないが、コアは鏡像対象の配置ではないので、1次キャッシュがどこにあるにしてもコア1個分の距離は離れているので、相手コアの1次キャッシュまでバスを引っ張るのは大変である。更に、相手コア側のキャッシュに必要なデータがある頻度は、自コア側のキャッシュにデータがある頻度に比べて低いであろうから、同等にアクセスできるようにハードウェアを注ぎ込むのは効率が悪い。
一方、普通の作りでは、自コアの1次キャッシュをミスすると共用の2次キャッシュにアクセスし、相手コアの1次キャッシュにデータがある場合は、Inclusion Cacheであれば2次キャッシュにヒットし、そこからデータが読まれる。わざわざ、直接転送と言っているので、この2次キャッシュからの転送に比べてメリットがなければならないが、どのような仕掛けで、どの程度性能に効くのか、追加したハードウェア量と比較して意味のある程度の性能向上になっているのか等、良くわからないことばかりである。
最後のブレットで改善されたメモリアクセスと題して、改善されたプリフェッチとMemory disambiguationというのがある。プリフェッチについては以前述べた ように、必要なデータを事前にキャッシュに読み込んでおく技法で、次に使われる番地の予測については色々な技法があり、詳細は不明であるが、これを改善したのではないかと思われる。
もう一つのMemory disambiguationは辞書には載っていないが、ambiguityは曖昧さという意味であり、メモリの曖昧さを無くすという意味である。と言われてもピンと来ないが、アウトオブオーダ実行を行うマシンではLoad、Storeの順序が変わって実行されてしまうことがあるが、Storeした番地からデータをLoadする時に、実行順序が逆転してStore以前のデータがLoadされてしまうのではプログラムの実行が滅茶苦茶になってしまう。そこでアドレスに重なりが無い場合にはLoad、Storeの順序を適当に入れ替えて性能が出るように実行するが、アドレスが重なった場合には、それをプログラム順に実行したのと同じ結果になるように制御するのがMemory disambiguationである。これも色々な技法のある分野であり、何かの効率を改善したのであろうが、具体的に何を改善し、どの程度性能に貢献するのかは不明である。
まとめ
何れにしてもキャッシュはCPUチップの半分程度の面積を占めるようになってきており、その意味ではプロセサコアと同等かそれ以上の重要性を持つメカニズムであるが、IDFの報道などを見ても、その構造や動きはあまり理解されていないのではないかと思いこの連載を書いた。
基礎編では、キャッシュにどのような単位でメモリデータが格納されるか、マルチコアプロセサでは各コアはどのようにキャッシュを使用するかから始まり、フルアソシアティブ、ダイレクトマップ、セットアソシアティブ方式のキャッシュの構造やその長所、短所について述べた。また、上級編では、プリフェッチ、仮想メモリをサポートする場合のキャッシュの構成、マルチプロセサの場合のコヒーレンス制御について述べた。続いて、キャッシュのプロセサ性能への貢献とVictim Cacheなどのこれまで説明が漏れていた項目をカバーした。そして、応用編では、キャッシュによる性能向上を数値的に示し、最後に最近のIDFでの発表スライドを元に、Intelの次世代プロセサのキャッシュ構造の分析を行った。
長々と書いてきたが、これでもキャッシュについて語り尽くしたわけではなく、冗長構成による歩留り向上、宇宙からの中性子のヒットによるメモリの間歇エラーを救済する誤り訂正符号などの話は完全に抜け落ちている。また、コンピュータアーキテクチャというよりは、回路設計技術であるが、メモリを安定に動かすためのメモリセルやセンスアンプの設計についても膨大な技術やノウハウの蓄積があり、キャッシュの設計は意外に奥が深い。
まだ、不十分な記述であるが、拙文がキャッシュの理解に貢献することが出来れば幸いである。