IA-32 (Intel Architecture 32)とは
IA-32は、
インテルが開発した
32ビットの命令セットアーキテクチャであり、x86アーキテクチャを拡張したものです。このアーキテクチャは、80386プロセッサの開発時に定義され、それまでの
16ビットアーキテクチャを
32ビットに拡張しました。IA-32という名称は、
インテルが後に
64ビットアーキテクチャである
IA-64を発表した際に、従来の
32ビットアーキテクチャを区別するために用いられた
レトロニムです。
IA-32の歴史
インテル8086から続く命令セットアーキテクチャは、拡張を重ねながら後継プロセッサへと引き継がれてきました。80186、80286、そして386、486と進化を遂げ、これらはまとめてx86と呼ばれています。このx86アーキテクチャの中で、
32ビットに拡張された386以降のアーキテクチャを指して、IA-32と呼ぶようになりました。これには、Pentium、Celeron、Core、Atomなどの
32ビット版も含まれます。
IA-32という名称が生まれたのは、386の登場時ではなく、1990年代後半、
64ビット化が見えてきた頃です。
インテルは、従来のx86の冗長性を解消するために、HPと共同で全く新しい
64ビットアーキテクチャである
IA-64を開発し、Itaniumプロセッサとして実装しました。
IA-64は従来のx86アーキテクチャとの互換性がなく、市場に受け入れられませんでした。そこで、従来の
32ビットx86アーキテクチャをIA-32と名付け、
IA-64と対比させました。
インテルは、
IA-64に重点を移し、
ハイエンド市場でサーバ用
RISCメーカーを追い落とし、
ローエンド市場で互換CPUメーカーを振り切る戦略を描いていました。しかし、
IA-64はIA-32との互換性が低く、市場ではIA-32との上位互換性を持つ
64ビット拡張が求められました。そのため、AMDが先にx86の
64ビット拡張であるx86-64(後のAMD64)を発表しました。これは、
16ビットの8086から
32ビットの386への拡張と同様に、IA-32との互換性を保ちながら
64ビットに拡張するものでした。
その後、
マイクロソフトからの圧力もあり、
インテルはAMD64と互換性を持つIntel 64を発表しました。当初、Intel 64はIA-32eなどとも呼ばれていましたが、最終的にはx64という総称で呼ばれるようになりました。IA-32マイクロプロセッサは、386DXから現在のAtomの一部まで数多く存在します。
IA-32の特性
命令セット
IA-32は、8086との互換性を維持しながら拡張を続けてきたため、命令フォーマットに多くのバリエーションを持つ可変長命令セットとなっています。頻繁に使用される命令は1バイトで表現されることが多く、
RISCの固定長命令に比べてコード密度が高いです。また、1つの命令で複雑な動作をするものもあり、中には
擬似コードでif文が3つも出現するような複雑な命令も存在します。
性能
コード密度が高いため、1度のメモリアクセスで複数の命令を同時に取り込むことができ、命令読み取りに必要なバンド幅を削減できます。また、演算パイプラインを複数備える
スーパースカラー構造において、IPC(Instructions Per Cycle)の向上に貢献します。単一の命令で複数の処理をまとめて行うことで、マイクロコードの実行比率を高め、処理時間を短縮しています。
複雑な命令セットのため、ワイヤードロジックでの実行は難しいと考えられていましたが、
インテルは486で一部の複雑な命令を除いてワイヤードロジック化しました。Pentiumでは、
スーパースカラーを採用したことでデコーダの複雑性が増し、完全にマイクロコードを排除することは困難でした。
P6マイクロアーキテクチャでは、複雑な命令を複数の単純な命令に変換し、内部の
RISCプロセッサで実行することでこの問題を解決しました。この技術は、R800やNexGenのNx586で先例があり、
インテルは
P6マイクロアーキテクチャの開発に役立てたとされています。その後、P6の考えを発展させ、命令発行部と命令実行部を分離したNetBurstマイクロアーキテクチャへと発展しました。しかし、NetBurstは消費電力が増大するというデメリットがあり、消費電力を抑えつつパフォーマンスを向上させる必要が生じました。そこで、動作周波数を向上させるのではなく、1クロック中により多くの処理を行う
Coreマイクロアーキテクチャへと移行しました。
FSB (Front Side Bus)
IA-32プロセッサのFSBは、Pentium Proで大きな発展を遂げました。以降のプロセッサのFSBも基本的にPentium Pro時のプロトコルを継承していますが、世代ごとに修正が加えられています。例えば、
Pentium 4世代では、アドレス系バスが基本バスクロックの2倍、データ系バスが4倍の速度で転送されるようになりました。また、キャッシュラインサイズが32Byteから64Byteに引き上げられ、バスの使用効率が高められています。
ハイエンドプロセッサの
Xeon MPでは、
IA-64のFSBプロトコルに似せた拡張がなされ、大規模なサーバ向けチップセットで効率的なデータ転送が可能になっています。IA-32プロセッサのハードウェア構成は、PC/ワークステーション向け、
ローエンドからミッドレンジ向けの2-Way、
ハイエンドサーバ向けの4-Way以上の3種類があり、相互に互換性がなくなってきています。将来的には、シリアル通信を基本としたQuick Path Interconnectと呼ばれるプロセッサ間接続が導入される予定です。
メモリ搭載の限界
仮想アドレス空間
多くのx86向け
オペレーティングシステムで採用されているフラットメモリモデルでは、すべてのセグメントセレクタが同じリニアアドレス空間を参照します。この場合、プロセスごとに
32ビットの仮想アドレス空間が利用でき、1プロセスに与えられるメモリ空間は4GiBとなります。P6以降のプロセッサでは、物理アドレス拡張(PAE)により最大64GiBの物理メモリにページを割り当てることが可能になりましたが、ユーザープロセスが扱える仮想メモリ空間は依然として4GiBに制限されていました。そのため、大規模なメモリ空間を必要とするソフトウェアでは
64ビット化が強く求められるようになりました。
x64では、仮想アドレス空間は設計上256TBまでリニアにアクセスできるようになり、
オペレーティングシステムもこれに対応しました。また、
32ビットアーキテクチャで課題だったカーネル空間の配置問題も解消されました。
物理アドレス空間
IA-32プロセッサは物理的には40ビットのアドレスをサポートしており、4-Way以上の
Xeon MPでは、チップセットの制約があるものの最大1TBの物理メモリをサポート可能です。ただし、
Xeon DPやPC用の廉価版CPUでは、物理アドレスバスが36ビットのため、物理アドレス空間は64GBに制限されます。
メモリ技術の進化
近年の高速DDR SDRAMでは、1チャネルあたりに実装可能なDIMMは電気的制約から4枚程度が限界とされています。そのため、多チャンネル対応が必須となります。従来のDIMMは1チャネルあたり約150ピンを必要とするため、チップセットの負担が大きくなります。この問題を解決するため、
インテルは少ピン高速インターフェースを持つFBDIMMを規格化しましたが、FBDIMMには発熱やレイテンシの問題がありました。そのため、
インテルはメモリコントローラをCPUに内蔵し、通常のDIMMを利用可能にする方向に転換しました。
Nehalem以降、メモリ技術は大きく進化しており、DDR4やDDR5が登場し、データ転送速度や消費電力効率が向上しています。また、NUMAなどの技術により、マルチソケット環境でのメモリアクセスの効率化が進んでいます。さらに、不揮発性メモリ技術も登場し、メモリとストレージの境界が曖昧になってきています。
IA-32のマイクロアーキテクチャ一覧
IA-32のマイクロアーキテクチャには、以下のようなものがあります。
- - 80386
- - 486
- - P5 (Pentium 他)
- - P6 (Pentium Pro, Pentium II, Pentium III, Celeron, Xeonなど)
- - P7 (Itaniumの開発コードネーム)
- - NetBurst (Pentium 4, Pentium Dなど。途中でIntel 64が拡張)
- - Atom系
- - Core (Coreマイクロアーキテクチャ)
- - Nehalem (Core i7として発売)
- - Sandy Bridge (AVX命令セットが追加。ソケットLGA 1155とLGA2011)
- - Haswell (ソケットLGA1150とLGA2011-v3)
- - Broadwell
- - Skylake (Larrabeeが組み込まれる。ソケットLGA1151)
- - Cannonlake
- - Larrabee (x86から派生した命令セットをシェーダーコアに採用したGPU)
結論
IA-32は、x86アーキテクチャの進化の中で重要な役割を果たしました。
32ビットへの拡張から始まり、様々な技術革新を経て、今日のコンピューティング環境の基盤を築いています。その歴史と技術的特徴を理解することは、現代の
コンピュータアーキテクチャを理解する上で不可欠です。