IA-64

IA-64（Intel Architecture 64、アイエーろくよん）はインテルとヒューレット・パッカードが1994年に共同発表した64ビットマイクロプロセッサの命令セットアーキテクチャ(ISA)。Itaniumで採用された。
特徴としてEPICアーキテクチャを採用し、多数のレジスタを持つ。インテルの従来の32ビットであるIA-32(x86)とは、命令セットの互換性は無いが、IA-32のエミュレーションモードを持つ。IA-64は当初はIA-32の後継ともされたが、実際にはx86を64ビットに拡張したx64の普及もあり、特定用途に留まった。2019年1月、インテルは2021年のItaniumの製造終了予定を発表し、後継も無いため、IA-64は終了した。

名称

正式には「Intel Architecture 64」で、インテルの戦略面の強い用語である。現在では、既存のx86ベースの64ビット化であるIntel 64などが主流となった影響か、インテルの資料でも「IA-64」の用語は減少し、Itanium 2などの説明も「EPICアーキテクチャを採用した」など個別の技術名が使われている。

概要

インテルは1990年代に、x86で32ビットのパーソナルコンピュータ市場では主流となったが、64ビットのサーバ市場はいわゆるRISC陣営（SPARC、MIPS、PA-RISC、POWERなど）に占められており、また32ビット市場でもAMD、Cyrixなど互換プロセッサーメーカーの攻勢を受けていた。
インテルはRISC陣営の一社であるヒューレット・パッカード (HP)と提携し、HPのVLIW技術（後に改良版のEPICアーキテクチャ）を採用するIA-64の共同開発を発表した。この際、従来の32ビットまでのx86アーキテクチャをIA-32と呼び、将来的にはIA-64に置き換えられるとした。またHPはIA-64を自社のPA-RISC(HP-UX稼動CPU)の後継と位置づけた。
この提携の目的は、インテルには上位サーバ市場への本格進出と互換プロセッサーメーカーの振り切り、更にはWindows NTでRISC(MIPS、Alpha、PowerPC)もサポートしたマイクロソフトへの牽制、またHPには次世代プロセッサーの開発費用分担と事実上の業界標準への狙いがあったと言われるが、PC市場のインテル独占状態がサーバ市場にも及ぶと考えられ業界に衝撃を与えた。またIA-64は既存のIA-32とは互換性が無い（エミュレーションのみ）事も広く議論となった。
しかしIA-64は、Itaniumの開発遅延と性能の低さ、結果としてHP（およびHPと提携する日本電気、日立製作所）以外の採用メーカーの少なさ、自社以外のサポートOSの少なさ、その間の競合プロセッサ（SPARC、POWERなど）の性能向上、更にはx86市場の64ビット化にはx64（IA-64を批判したAMDによるAMD64、およびインテル版実装のIntel 64）が普及してしまった。2005年9月にはデルがIA-64から撤退した。POWERを持つIBMも2005年以降はほとんど採用していない。
IA-64は現状では、HP（およびHPと提携する日本電気、日立製作所）のPA-RISC後継、およびレジスタ数が多いなどエミュレーションによって異なるアーキテクチャからの移行が容易な事もあり、一部の無停止コンピュータ（HP Integrity NonStopなど）やOpenVMS、メインフレームやオフィスコンピュータ（富士通、日本電気、Bullなど）の置き換えプロセッサが中心となっている。

アーキテクチャ

主流となっているアウト・オブ・オーダー実行設計では、複雑なデコーダシステムがパイプラインに入ってきた命令を調べ、並行して実行できる命令を選んで実行していく。
A := B + C;D := F + G;
例えば上記の2行のコードは互いに影響しないので同時に実行できる。したがってこれらはふたつの実行ユニットにそれぞれ渡されて並行して実行される。命令レベルの並列性を引き出すことが最近のCPUで性能を向上させる基本である。
コードが並行して実行できるかどうかを予測することは難しい。多くの場合、ある命令が別のある命令に依存しているかどうかは様々な条件に左右される。先にあげた例が次のようになっていたらどうだろうか。
A := B + C;IF A = 5 THEN D := F + G;
こうなると計算自体は依存していないのだが、ふたつめの加算結果をDに格納するかどうかはひとつめの計算結果に依存する。
このような場合、CPUは一般的には結果を推量する。例えば、IFが90%の確率で成立する場合、ふたつめの加算処理は別の実行ユニットに渡されて実行される。ところがその推量が間違っていた場合、ふたつめの加算をなかったことにしなければならず、大きな性能低下を招く。最近のCPUの性能向上は推量ロジックがいかに高確率で推量するかにかかっているが、改善は徐々に始まったところである。
IA-64はコンパイラにその仕事を任せている。プログラムをCPUが実行する前にコンパイラがコードを調査してCPUが実行時にするような判断を行う。どのパスを通るかを決めたら、コンパイラは並行して実行できる命令を集め、ひとつの大きな命令に入れる。そして、それを並べてプログラムを作成する。
これをVLIW"very long instruction word"(非常に長い命令語)という。
CPUからコンパイラにこの仕事を移管することは、いくつかの利点がある。第一にコンパイラはコードを時間をかけて調べることが出来る。これはとにかく高速に実行しなければならないCPUにはない利点である。したがってコンパイラの方がチップで実行する場合よりも予測精度を高められる。第二に予測回路は非常に複雑であり、これをコンパイラに移管することで回路を大きく削減できる。CPUは調べて推量する必要がないので、命令を分割して各実行ユニットに渡してやればよい。第三にコンパイラで推量をするのは一回限りなので、CPUで実行するたびに推量するより効率的である。
欠点としては、プログラムの実際の動きはコード生成時に完全に予測できるとは限らないということが挙げられる。実際の動きは入力されるデータの内容に大きく左右される。アウト・オブ・オーダー実行ロジックを持つ主流のCPUは実行時に実際のデータに基づいて決定できるのに対して、コンパイラは入力データを推量することしかできない。したがって、コンパイラがCPUよりも予測を失敗する可能性がある。つまりVLIWの性能はコンパイラの性能に大きく依存する。VLIWはマイクロプロセッサのハードウェアの複雑さを低減する代わりにコンパイラの複雑さを要求するものである。

レジスタ

IA-64アーキテクチャは、128本の64ビット整数レジスタ（r0 - r127）と128本の82ビット浮動小数点レジスタ（f0 - f127）という非常に多くのレジスタを定義している。

整数レジスタ

128本の64ビット整数レジスタ（r0 - r127）の内、汎用レジスタとしてはr0 - r31の32本が使われる（r0はゼロレジスタで、読み出すと常に 0 を返し、書き込むと例外が発生する）。
残りの96本（r32 - r127）はレジスタスタックエンジン (Register Stack Engine; RSE) を使ったレジスタローテーションという手法で管理され、プロシージャ呼び出し間で名前が変更される可能性がある。これは多くのRISCプロセッサに見られるレジスタ・ウィンドウを洗練させたもので、AMD Am29000のオーバーラップウィンドウサイズを変更可能なレジスタ・ウィンドウとの類似性が指摘されるが、IA-64ではプレディケーションと組み合わせることで、ループを自動的に展開して実行することができる。

命令セット

本アーキテクチャはマルチメディア演算や浮動小数点演算に関する命令も用意している。
典型的なVLIWではロング命令ワードの各サブ命令の位置が特定の機能ユニットに対応しているが、Itaniumではサブ命令の配置についていくつかの組み合わせ(バンドル)を用意していて、その中にはシリアル実行モードとパラレル実行モードのバランスをとるものもある。バンドルのエンコーディングには将来のIA-64の拡張のために空きがある。加えて、Itaniumは個別に設定可能なプリディケートレジスタ（predicate register）を持っており、各命令について実行時に出力するか否かを決定できる。
Itaniumは、起動した時点ではいくつかの命令実行機能が動作しないようになっている。ブートストラップが実行されるとまずExtensible Firmware Interface (EFI) がロードされ、追加の命令がチップ内のメモリに格納される。続いてプロセッサモード(64ビットか32ビットか)や他のブート時の設定が行われる。この設計によりItaniumシステムはEFIプログラムの内容によって異なった機能を展開できる。

IA-32サポート

IA-32をサポートするため、Itaniumは特殊なジャンプ命令で32ビットモードに移行する。IA-32命令はItaniumの各機能ユニットで実行される。しかし、ItaniumはEPICスタイルの命令を高速に実行するよう設計されているため、アウト・オブ・オーダー実行機能を持っておらず、IA-32コードの実行はIA-64モードと比較してもPentium系プロセッサと比較しても非常に性能的に不利である。例えば、Itaniumの機能ユニットは通常のALUでの計算の副作用のため整数フラグを自動的には生成しないし、境界が整っていないメモリロードを複数続けて行うようにはできていない。LinuxやWindows上で動作するIA-32ソフトウェアエミュレーターがあるが、ハードウェアがIA-32モードで実行するよりもエミュレータで実行した方が約50%高性能である。
Windowsエミュレータはマイクロソフトから、LinuxエミュレータはNovellのようなLinuxベンダーから入手可能である。Itanium 2のMontecitoからはハードウエアデコーダは削除され、Extensible Firmware Interface (EFI) でIA-32エミュレータがロードされる様になった。