Cache/Memory/QPI

Cache/Memory/QPIについて説明したい。まずCacheであるが、兼ねてから言われていた通り、3レベルの構造となる(Photo24)。各コアは32KBのL1 Instruction/Data Cacheと256KBのUnified Cacheを持ち、これは従来通り各コアが独占する。これに加え、全てのコアで共有する形のL3キャッシュを、Quad Coreの場合で最大8MB搭載する。ただ、ここでL3 CacheがInclusiveであることを強くアピールしているのは、やはりAMDへの対抗であることは間違いないだろう。それはともかく何故L2を256KBに縮小したかだが、理由は2つ考えられる。1つはLatencyの削減。ConroeのL2 Cacheはこちらグラフ22でも判るとおり、最良の場合でもLatencyが8~9Cycle必要とされる(PenrynではL2が大容量化した関係で更に遅くなった)。これをもう少し高速化したいと思った場合、やはり容量を下げるのは効果的である(Hit/Missの検索に要する時間が短縮されるからだ)。256KBまで縮小すれば恐らく6Cycle程度までLatencyは削減される筈だ。これは当然L1 Miss/L2 Hitの場合の性能改善に役立つ。当然容量は減る分、アプリケーションによってはHit率は下がるだろうが、それはL3 Cacheでカバーすれば良いという判断だろう。

Photo24:L1のサイズは従来と同じく32KBずつ。ただし"Support more L1 misses in parallel than Core 2"とあることから、L1/L2間の帯域を増やすと共に、複数のCache Miss/Cache Fillのシーケンスを同時に実行できるような工夫がなされている模様だ。恐らくSMTに対応して、2つのCache Miss/Fillを独立して行えるようにしていると想像される。

Photo25:Quad-Coreで最大8MBという書き方をしているところを見ると、何らかの理由でL3キャッシュの構造は今のところ2MB×コア数に制限されているようだ。ただこのあたりは将来は拡張できるようだが。

2つ目は、Inclusive Cacheでは避けられない、Cacheの利用効率の低下を避けるためだ。最初のNehalemは8MBの容量と言いながら、4つのコアが各々持つ256KBのL2キャッシュと内容が重なる公算が高いから、実質的に意味がある容量は8MB - 256KB×4 = 7MBとなる。逆に言えば、それでも7MB残る計算だ。これがコアあたり1MBとかになると、実質的なL3の容量は4MBに減ってしまい、平均してコアあたり1MBしか割り当てられない事になってしまう。Inclusive Cacheの構成を取る以上、ある程度L2とL3の容量差が大きくないと、折角のL3の効用が薄れてしまいかねない。

さてそのL3 Cacheだが、今回は素直にInclusive Cacheの方式を取った。実は2007年のMicroProcessor ForumでIntelはMany Core時代のキャッシュ構成に関する研究を発表しており、このなかでMany Core世代ではNCID(Non-inclusive Cache, Inclusive Directory)が最適という見解を発表しており(Photo26)、Nehalem世代では最大8コアまでサポートされるから、あるいはこれを搭載してくるかと思ったが、素直にInclusive方式とした(Photo27)。

Photo26:MicroProcessor Forum 2007におけるRavi Iyer氏(Principal Research Scientist, Corporate Technology Group)の"Re-inventing Multi-Core Cache & Memory"という講演のスライドより抜粋。NCIDとは、データそのものはExclusive構成だが、データの管理情報(Directory)はInclusiveとする方法。キャッシュ領域を効率的に使えるし、DirectoryをL3キャッシュに持つことで無駄なSnoopingが防げるというメリットがある。デメリットは、それでもデータの移動そのものが発生するので、Inclusiveほど高速ではない事だ。

Photo27:ExclusiveとInclusiveの比較。実はNCIDを使うとこの無駄なSnoopは削減できるわけだが、それでもInclusiveの方が良いと判断したのは、Dual Coreの場合なども考慮したためだろうか?

こうしてみると、Nehalem世代はL3 Cacheを追加したというよりは、L2 CacheをL3 Cacheに格下げし、L1 Cacheとの間にL1.5 Cacheという位置づけのCacheを追加した、と考えるのが妥当な気がする。おまけに命令Cacheに関してはLoop Stream DetectorがいわばL0.5 Cacheとして動作するわけで、実に4段構成もの重厚なCache構成を取るアーキテクチャになったと考えるのが妥当かもしれない。