Spring Processor Forum 2006 で AMD が Quad Core の概要を公開

上記の記事に詳しいが、AMD は4コア化や浮動小数点演算能力の強化など性能面で大幅な向上をめざしている。Pentium4/Xeon を降した今、次の敵 Itanium に狙いを定めているとのこと。

性能面以外で気になった点を突っ込んでおく。

仮想メモリのページサイズに 1GB/page が加わる

AMD64仮想メモリのページテーブルをハードウェアで構成しているために自由度が少ない。ページサイズはできるだけ大きい方が TLB に負担がかからなくてよいのだが、IA-32 の連続性を重んじて AMD64 では 4KB/page が基本になっている。ギガバイトのメモリを載せる昨今では、「小さい」といより「細かい」ぐらいのページサイズだ。

AMD64 は 4KB/page を 4 段のページテーブル構成でさばいている。各段のインデックスが 9 ビット。これはテーブルのサイズが基本ページサイズと同じ 4KB になるようにとの配慮だ*1。9 ビット× 4 段 + 12 ビット (4KB) = 48 のため、AMD64 は 64 ビット CPU だが仮想アドレスは 48 ビットまでしか使えない*2

結局、48 ビットの仮想アドレスを 4 段のページテーブルで 9 : 9 : 9 : 9 : 12 に区切っているのだが、3段目のテーブルのエントリで止めることで 9 : 9 : 9 : 21 に区切って 2MB/page を使うラージページ機能も存在した。今回はさらにこの上を設け、9 : 9 : 30 に区切って 1GB/page にする機能を追加するようだ*3

ちなみにライバルの Itanium2 のページサイズは 4K、8K、16K、64K、256K、1M、4M、16M、64M、256M、1G、4G と多彩。

RAS 機能強化

記事中には Memory Mirroring と Data Poisoning が挙げられているが、そりゃチップセットの機能とちゃうん?と一瞬思ったが、メモリコントローラがプロセッサの中にあるので CPU の機能なのね。

Opteron の Machine-Check Mechanism はかなり貧弱だ。BIOS and Kernel Developer's Guide for AMD Athlon 64 and AMD Opteron Processors の 5.2 節あたりに触れられているが、プロセッサ内で ECC がかかっているのはデータキャッシュのデータ部分だけで、それも The data cache is protected by ECC; however single bit ECC errors encountered by normal load and store accesses are not corrected. When the data cache scrubber encounters a single-bit ECC error, it corrects it. とのこと。ECC があると1バイト中に1ビットのエラーがあっても訂正が効くわけだが、それは命令がキャッシュからロード・ストアするタイミングではダメで、キャッシュが暇な時に scrubber がキャッシュを舐めて直していくからね、ってことかよ。キャッシュの ECC ってそんなものでいいのか?

そういうわけで Opteron の RAS 強化には違和感があるのだが、プレゼンで触れてないだけでプロセッサ内の足回りも強化はするんでしょう。

ちなみに Itanium2 の RAS 機能は Itanium Processor Family Error Handling Guide に触れられているが強力で網羅的だ。Montecito に至っては CPU ミラーリングや多数決冗長系をやるための LockStep 機能まで実装してくる*4

命令の追加

  • Bit Manipulation extensions (LZCNT/POCNT)
  • SSE extensions (EXTRQ/INSERTQ/MOVNTSD/MOVNTSS)

LZCNT は Leading Zero Count で、POCNT は Population Count だろうね。いらねぇ。
SSE の方は、PC Watch の記事では MOVNTSD/MOVNTSS はキャッシュをバイパスする転送命令で、EXTRQ/INSERTQ は Queue 操作命令だろうと書かれている。Queue 操作系の方はキャッシュ・コヒーレント・プロトコルと絡んだものではないかしら?

仮想化

これは順当に I/O Virtualization と Nested Paging が加わるようだ。

*1:1ページに対して8バイト(2^3)の情報が必要なので、4KB(2^12)を 8 で割ると512(2^9)になる

*2:64ビットの下位48ビットだけが有効

*3:次にページサイズを増やすとすると 9 : 39 に区切って 512GB/page になりそうだ。

*4:動くかどうかは別問題。