IA-32
IA-32(アイエー32、Intel Architecture 32)は80386の開発の際に定義された、16ビットx86を32ビットに拡張した命令セットアーキテクチャである。
IA-32という呼称自体は、インテルが新しい64ビットアーキテクチャであるIA-64を発表した際に、それと対比して従来の32ビットアーキテクチャ(すなわち、386以降その時までのx86)を指すものとして作られた一種のレトロニムである。
インテル8086の命令セットアーキテクチャは拡張を加えつつ後継プロセッサに引き継がれ、(80186)、80286、386、486に到るまで、その名称からまとめてx86と呼ばれている。そのx86アーキテクチャの中で、アーキテクチャを32ビットに拡張した386以降、x64より前のアーキテクチャを指して(PentiumやCeleronやCoreやAtomなどのうちの32ビットのものも含む)、現在はIA-32という。
80386と同時にIA-32の名が生まれたわけではない。もっと後の、32ビットプロセッサが十分一般的になり将来の64ビット化が見えてきた1990年代後半、インテルは旧来からの互換性を重視するあまりに冗長になってきたx86の置き換えを図り、HPと共同で全く新たな64ビットアーキテクチャのIA-64を定義し、それを実装したプロセッサItaniumの開発に踏み切った。IA-64・Itaniumには従来製品と互換性はなく、しかし普及への弾みを期待して市場の事実上の標準のインテルが開発している64ビットアーキテクチャであることを印象付ける目的があったと考えられる。IA-64に対し、従来の32ビットx86のアーキテクチャをIA-32と名付けた。IA-64#開発方針インテルはx86との連続性を断ち切ったIA-64に徐々に重点を移し、ハイエンドでサーバ用RISCメーカーを追い落とし、ローエンドで自社の過去であるx86と互換CPUを作る互換CPUメーカーを振り切る狙いであった。
インテルの狙いはともあれ、IA-64はIA-32と互換性がない(IA-64#IA-32サポートにより一応実行できるが、ろくな性能が出ない)ため、市場では従前のシステムをそのまま生かしたまま拡張できる、IA-32の上位互換の64ビット拡張が望まれていた。AMDが先んじてx86の64ビット拡張であるx86-64、後のAMD64(x64#AMD64)を発表した。これは、16ビットの8086との互換性を保ったまま32ビットの386に拡張したように、IA-32との互換性を保ったまま64ビットに拡張したものである。
エンドユーザ向けシステムのオペレーティングシステムで大きなシェアを占めるマイクロソフトから一本化の圧力をうけて、AMD64と互換を取る方針に転じ、Intel 64(x64#Intel 64)を発表するにいたった。インテルは当初Intel 64についてIA-32eなどとも呼んでいた。
AMD64もIntel 64もIA-32の64ビット拡張であり、いろいろ紆余曲折があったが、結局総称としてはx64と呼ばれている。
IA-32マイクロプロセッサは始祖の386DXから現行のIntel Atomの一部まで数多く存在する(上位互換のx64を含めてIA-32にカウントすることもある)。x64ではなくIA-32を現行で採用する理由としては、性能より省電力の要求が高いモバイル用や、仮想化で軽い仕事をさせる前提である、といったものがある。
8086との互換性を維持したまま拡張を続けてきたため、命令フォーマットに多数のバリエーションがある可変長命令セットとなっている。頻繁に使用される命令の多くが1バイトで表現されることから、典型的なRISCの4バイト固定長命令に比べてコード密度が高い。
1命令で複雑な動作をする命令もあり、例えば、インテルから提供されるリファレンスマニュアルに記載されている、動作を表現する擬似コードにおいてif文が3個も出現する、非常に複雑な命令も存在するほどである。
コード密度が高い事から一度のメモリアクセスで386においては最大4命令、Pentiumにおいては最大8命令を同時に取り込むことができ、命令読み取りに要するバンド幅を低減させるとともに、演算パイプラインを複数備えるスーパースカラー構造においてIPCの向上に寄与する。また、単一の命令で複数の処理を一括で行うことから、高速に動作するマイクロコードでの実行比率を高め、特定の処理を達成するのに要する時間を短縮した。
このような複雑な命令セットや複雑な命令は、ワイヤードロジックでの実行は難しいのではないかと考えられていたが、インテルは486で一部の複雑な命令を除いてワイヤードロジック化した。
PentiumのP5マイクロアーキテクチャでスーパースカラを採用するにあたり、前後の命令の依存関係をチェックする要求が加わると、なおのことデコーダの複雑性が増すこととなり、完全にマイクロコードを排除することは困難であった。
P6マイクロアーキテクチャでは、この問題を、複雑な命令を複数の単純な命令に変換し、内部のRISCプロセッサで実行するようにして解決した。これによりRISCの、命令コード密度が低い、複雑な命令が実行できないという欠点を克服しながらも、さらに従来のIA-32ソフトウエア資源を継承しつつ、新しい世代のプロセッサを開発する道筋を切り開いた。なおこのアイディアはインテルが最初に考案したものではない。古くはR800がそのようなデザインであったし、マイクロプログラム方式のアイディアをワイヤードロジックで実装したものとも言える。x86互換プロセッサでは、AMDに吸収されたNexGenのNx586が最初である(吸収された後AMD K6の基となった)。インテルはこのアイディアを貪欲に吸収し、P6マイクロアーキテクチャの開発に役立てたと言われる。
その後、P6の考えをさらに推し進め命令発行部と命令実行部を分離したNetBurstマイクロアーキテクチャへと発展した。しかし、パイプラインを細分化して動作周波数を高める事でパフォーマンスを向上させる事を前提としたアーキテクチャであり、パフォーマンスと引き換えに消費電力が増大して冷却が困難になるというデメリットを抱えた。消費電力が100W前後に達し、もはや通常のパソコンへの搭載が不可能な域に達すると、以後は、消費電力を増やさずにパフォーマンスを高める必要性が出てきた。その解決策としてP6とNetBurstを大きく見直し、動作周波数を向上させるのではなく、1クロック中により多くの処理を行う方向へ転換し、消費電力を抑えたCoreマイクロアーキテクチャへと移行した。Coreでは、「Coreマイクロアーキテクチャはもはや内部RISCプロセッサのアーキテクチャではない」と言われた。P5ではMMX、P6ではSSE (SSE1) が導入されたSIMD拡張だが、NetBurstではSSE2が導入され動画ストリームの処理が強化された。
IA-32プロセッサのFSBはPentium Pro時に大きな発展を遂げ、以降のプロセッサのFSBも基本的にPentium Pro時のプロトコルを継承している。但し世代ごとに若干の修正が加えられており、例えばPentium 4世代においては、アドレス系バスが基本バスクロックの2倍、データ系バスが4倍の速度で転送が行われるようになった。同時に、キャッシュラインサイズが32Byteから64Byteに引き上げられた。またエラープロトコルにも若干の修正が加えられ、バスの使用効率が高まるよう変更された。さらにハイエンドプロセッサのXeon MP(4-Way以上をサポート)においては、IA-64のFSBプロトコルに似せて大きな拡張がなされており、複数のFSBを有する大規模なサーバ向けチップセットで、効率的にデータ転送が行えるようになっている。このように、IA-32プロセッサのハードウェア観点では、PC/ワークステーションなどの1-Way向け、ローエンドからミッドレンジ領域の2-Way向け、ハイエンドサーバ領域の4-Way以上向けの3種類が併存し、相互に互換性が無くなってきている。将来的にはシリアル通信を基本としたQuick Path Interconnectと呼ばれる新たなプロセッサ間接続をCPUへの導入計画している。
ベースアドレスを0に固定し、オフセットのみを用いるFLAT MODELが多くのx86向けオペレーティングシステムに採用されている。このメモリモデルの場合、オフセットに使えるアドレス範囲は32ビットで、全てのセレクタが同一の仮想アドレス空間を参照していた場合1プロセスに与えられるメモリ空間は4GiBとなる。
P6以降では物理アドレス拡張により、最大64GiBまでの物理メモリにページを割り当てることができるが、ユーザプロセスが扱える空間は依然4GiBのまま変わらず、インメモリデータベースのような広大でリニアなメモリ空間が必要なソフトウェアにとっては64ビット化が望まれた。
x64により仮想アドレス空間は設計上では256TBまでリニアにアクセスする事ができるようになり、Windows、NetBSD、FreeBSD、OpenBSD、Linux、Solarisはこれに対応した。同時に32ビットアーキテクチャで懸念事項であったカーネル空間の置き場所という問題も解決した。この問題は深刻であり、オペレーティングシステムのスケーラビリティを著しく制限していたが、それがx64では解決された。
IA-32プロセッサの物理仕様上は40ビットアドレスをサポートしており、4-Way以上をサポートするXeon MPにおいては、MCHなどのチップセットによる制約はあるものの1TBの物理メモリをサポート可能である。但し、Xeon DP(2-Wayまで)やPC用の廉価CPUの領域においては、物理アドレスバスは36ビットであるため、物理アドレス空間は64GBまでとなっている。このアドレス空間の制限は、その世代において現実的に搭載可能な物理メモリの量を基準に決定されている。
近年の高速DDR SDRAMにおいては、1チャネルに実装可能なDIMMは電気的制限から4枚程度が限界とされている。さらに、将来のDDR SDRAM(後のDDR3 SDRAM)では当初、これを1チャネルあたり1枚まで減少することが検討されていた。この場合、メモリ搭載量を増やすためには必然的に多チャンネルをサポートする必要がある。しかし従来のDIMMは1チャネルあたり信号/GNDを合わせると150ピン前後を必要とするため、MCHなどのチップセット側の負担が大きく、多ピン化は即座にコストアップに跳ね返る。この問題を解決するためインテル主導でFBDIMM (Fully Buffered DIMM) と呼ばれる、シリアル転送に似た少ピンの高速インタフェースを有するDIMMを規格化した。2006年の時点で、DRAM各社はFBDIMMの生産を開始し、FBDIMMサポートのサーバも出荷された。FBDIMMではチップセット側で従来の半分以下のピン数しか必要としないため、少ピン数で多チャンネル化が可能である。またデイジーチェーンのようなトポロジを採用したため、1チャネルあたり8枚のDIMMをサポートすることが可能であり、今後サーバにおける搭載可能物理メモリ量も飛躍的に増大していくとされた。
しかし、このFBDIMMにはDIMM基板上のDRAMチップと接続される高速インターフェイス用コントローラチップ (AMB) の発熱や消費電力が過大となり、また1チャネルあたりの接続メモリモジュール数(=デイジーチェイン接続されるAMBチップ数)の増大に従ってメモリアクセス時のレイテンシが大きくなる(メモリ性能が低下する)という問題があった。レイテンシの増大は一般にCPUの内蔵キャッシュメモリの増量や命令処理の多段パイプライン化によって隠蔽が図られるが、これらの対策は、条件分岐予測が難しくまた局所性の低い巨大データを取り扱う、データベースなどの大規模アプリケーションソフトを実行する際には、有効に機能しない局面が多々存在する。さらに、DDR3メモリの規格化がなされた段階で1チャネルに実装可能なDIMM数は最大2枚となり、しかもFBDIMMはその規格立ち上げの段階でラムバスとの特許問題が発生し、ライセンス料支払いの必要が生じたことから、各社がこれを積極的に採用すべき、あるいは製品化すべき理由はなくなっていた。
そのためインテルは2006年以降方針を転換、Nehalemマイクロアーキテクチャを採用する各CPUにおいて、従来はMCHなどのチップセットに内蔵していたメモリコントローラをAMDのOpteronなどと同様にCPUに内蔵して通常のDIMMを利用可能とし、大規模サーバなどでは搭載CPUソケット数の増大に従って実装可能なDIMMソケット数も増えるという、スケーラブルなアーキテクチャへの転換を前倒し実施した。この方式はCPU自体にメモリコントローラを内蔵するためMCHとCPU間の通信で発生するレイテンシも削減できるというメリットがあり、この方式を採用したNehalemマイクロアーキテクチャ世代のXeonでは、FBDIMMに対応する前世代のCoreマイクロアーキテクチャ世代のXeonよりも低レイテンシでのメモリアクセスを実現している。