米Intel社が米Advanced Micro Devices社の「AMD64」互換の命令セット・アーキテクチャを採用した。Intelが2004年2月に発表したx86命令の64ビット拡張仕様「Intel 64-Bit Extension Technology」である。この拡張はAMDの64ビット命令セット・アーキテクチャやレジスタ構成とほぼ同じ。違いはCPU独自の実装となる仮想デュアルCPU機構や電源管理を制御する拡張命令程度だ。

写真●x86命令の64ビット拡張を宣言する米Intel社CEOのCraig Barrett氏
米国サンフランシスコで2004年2月に開催された開発者向け会議「Intel Developer Forum Spring 2004(IDF)」の基調講演の中で,サーバー/ワークステーション向けのCPUに64ビット拡張を施すことを明らかにした。
表1●米Advanced Micro Devices社(AMD)の命令アーキテクチャ「AMD64」と米Intel社の命令アーキテクチャ「Intel 64-Bit Extension Technology」が持つ動作モード
画面●AMD64とIntel 64-Bit Extension Technologyの命令アーキテクチャの比較例
ニーモニック,命令コードとも同じ。概観したところ,基本命令に違いは見られなかった。
図1●AMD64とIntel 64-Bit Extension Technologyのレジスタ構成
どちらも64ビット動作時は従来の汎用レジスタが64ビットに拡張され,64ビットの汎用レジスタが8個,SSEレジスタが8個にそれぞれ増える。
表2●AMDのCPU「Athlon 64」シリーズとIntelの「Pentium 4」シリーズの主な機能差
Pentium 4シリーズのみが備える仮想デュアルCPU機構の「Hyper-Threading Technology」や「SSE3」,Athlon 64シリーズのみが備えるSIMD命令「3DNow!」を前提としたプログラムは互換性に支障が出る。
図2●AMD64とIntel 64-Bit Extension Technologyの「EFER」レジスタ定義
EFERレジスタは,拡張機能の状態制御と監視に使う。64ビットモードへの移行を制御する「LME」ビットの定義はAMD64とIntel 64-Bit Extension Technologyで同じ。Intel 64-Bit Extension Technologyでは,高速なレジスタ退避/復帰機能を有効にする「FFXSR」ビット,および「NXE」ビットが予約ビットとして定義されている。
図3●メモリー・モジュールの搭載枚数を拡張する「FB-DIMM」
最大で1チャネル当たり8枚のメモリー・モジュールを搭載可能。バッファを介した信号による駆動が標準になる。インタフェースはシリアル・インタフェースの「PCI Express」を流用する。

 2004年2月18日,米Intel社がx86命令の64ビット拡張仕様「Intel 64-Bit Extension Technology」(以下64-Bit Extension)を発表した(写真[拡大表示])。米国サンフランシスコで2004年2月に開催された開発者向け会議「Intel Developer Forum Spring 2004(IDF)」の基調講演の中で,サーバー/ワークステーション向けのCPU「Xeon」に64ビット拡張を施すことを明らかにした。焦点となったのは,米Advanced Micro Devices社(AMD)が発売する64ビットCPU「Opteron」および「Athlon 64」シリーズの命令アーキテクチャ「AMD64」との互換性。IntelはAMD64と64-Bit Extensionとの互換性については明言していない。「Hyper-ThreadingやSSE3を使わなければまず動作する」と開発者向けの資料で言及しただけだ。しかし公開された開発者向けの資料からは,IntelがAMDに歩み寄った形跡が見て取れる。

基本命令は同じ

 まず互換性の大枠を決めるCPUの動作モードの構成を見てみよう(表1[拡大表示])。64ビットで動作するモードはAMD64が「Long mode」,64-Bit Extensionが「IA-32e mode」と呼ぶ。名称は異なるものの,各モードのアドレス・サイズとオペランド・サイズ,汎用レジスタ長の値は同じだ。64ビットモードに既存の32ビット・アプリケーションが再コンパイルなしに動作する「Compatibility」モードがある点,従来のx86互換CPUが備える32ビットモードを「Legacy」モードとして用意している点も同じである。

 互換性の鍵を握る命令セット・アーキテクチャとレジスタの構成もAMD64と64-Bit Extensionで大きな違いはない。まず命令セットでは,これまでAMDのCPUのみが搭載していた命令がいくつかある。例えばAMD独自の高速システム・コール命令「SYSCALL/SYSRET」命令が64-Bit Extensionに追加されている。すべてを突き合わせて見たわけではないが,基本命令(AMDは「General-Purpose Instruction」と「System Instruction」,Intelは「Instruction」と呼ぶ範囲)は機械語の「命令コード」,機械語を人の分かる略称に置き換えた「ニーモニック」ともIntelとAMDで同じだと言えそうだ(画面[拡大表示])。

 次にレジスタの構成。アプリケーションが利用する汎用レジスタとSSEレジスタの構成は64-Bit ExtensionとAMD64とで変わらない(図1[拡大表示])。どちらも従来8本あった32ビットの汎用レジスタが,64ビットモードでは64ビット幅に拡張される。加えて,64ビットの汎用レジスタが8本,SSE命令用のXMMレジスタが8本それぞれ増える。

独自機能の制御命令に差

 ただ細かく見れば,アプリケーションの互換性に支障が出る可能性がある違いもある。まず当然の事ながら,AMD,Intelがそれぞれの独自機能を制御するために設けた拡張命令は異なる(表2[拡大表示])。例えば,Pentium 4が備える仮想デュアルCPU機構「Hyper-Threading Technology」向けの命令は,仮想デュアルCPU機構を備えないAthlon 64シリーズにはない。逆にAthlon 64シリーズのみが備えるSIMD命令「3DNow!」は,64-Bit Extensionに含まれていない。これら命令を前提にした場合は,互換性に支障が出る。拡張機能に関してはほとんどのアプリケーションが起動時にCPUIDのレジスタを読み出して使用するプログラムを変える。実用上問題のないレベルだ。

 このほか,命令の振る舞いが異なるケースでは,浮動小数点レジスタの内容をメモリーに退避/復帰させる「FXSAVE」と「FXSTORE」がある。FXSAVE/FXSTOREは,マルチタスクを実現する際などでいったんレジスタの内容を退避させてから,別のプログラムを読み込んで,再度元のプログラムを実行する際にレジスタの内容を復帰させる命令である。この際,レジスタ内のデータが多いほど,メモリーへの転送に時間がかかりオーバーヘッドとなる。AMD64には,SSE命令を使用しない場合にXMM0~15レジスタを退避/復帰の対象から外して高速化した「Fast-FXSAVE/FXSTORE」を用意している。SSE命令は単精度の浮動小数点演算を扱う命令群だ。倍精度の浮動小数点演算を必要とする科学技術計算などではXMM0~15レジスタは不要だ。EFERレジスタの14ビットをオンにすることで,FXSAVE/FXSTORE命令がFastモードに切り替わる。64-Bit ExtensionではEFERレジスタの14ビット目は予約ビットとなっている。

 EFERレジスタにはもう一つ,AMD64にあって64-Bit Extensionでは未定義のビットがある(図2[拡大表示])。メモリーページをアクセス制御する「NX(No Execute)」ビットのオン/オフを制御する「NXE」ビットだ(詳しくはバイトレポート「CPUが用意してOSが使う,不正コードの実行を禁止する『NX』ビット」を参照)。

搭載可能な物理メモリーを増やす

 CPU固有の機能を除いて互換性があるため,すでにAMD64版の対応を進めてきたOSメーカーは一つのOSで両CPUに対応できる。米Microsoft社は2004年後半に出荷予定の「Windows XP 64bit Edition」と「Windows Server 2003 Service Pack1」で64-Bit Extensionに対応する。Linuxも,米Red Hat社が「Red Hat Enterprise Linux 3 update 2」を同年第2四半期に出荷する。米Novell社は「SUSE LINUX 9.1」を同年第2四半期,「SUSE LINUX Enterprise Server 9」を同年第3四半期に出荷する。

 Intel,Microsoftとも,64ビット化のメリットとして打ち出しているのは,4Gバイトが上限だった物理アドレス空間が40ビット,つまり1Tバイトに広がる点だ。これに合わせて,メモリー・モジュール搭載枚数の上限を上げなくてはならない。

 そこでこれまで主にサーバー向けに提供されていた「Registered-DIMM」を,2005年をめどに「FB-DIMM(Fully Buffered-DIMM)」に拡張する(図3[拡大表示])。Registered-DIMMは,レジスタ・チップをメモリー・モジュール内に置くことで,クロック信号とアドレス信号を補正してメモリーの駆動を安定させる。これに対しFB-DIMMでは,個々のメモリーチップの信号線を含めて,すべての信号が「Advanced Memory Buffer(AMB)」と呼ぶ制御チップを介したものになる。これによりチャネル当たり最大8枚のFB-DIMMを接続できる。メモリー・コントローラとのインタフェースはPCI Expressをベースにしたシリアル・インタフェース。AMBチップがメモリーチップのパラレル信号をシリアル信号に変換する。ただインタフェース変換時の遅延がオーバーヘッドとなる。

(高橋 秀和)