IA-64

インテルとヒューレット・パッカードが1994年に共同発表した64ビットマイクロプロセッサの命令セットアーキテクチャ(ISA)

これはこのページの過去の版です。Melan (会話 | 投稿記録) による 2005年9月30日 (金) 12:47個人設定で未設定ならUTC)時点の版であり、現在の版とは大きく異なる場合があります。

IA-64(あいえーろくじゅうよん、Intel Architecture 64)はインテルヒューレット・パッカードが共同で開発した、64ビットマイクロプロセッサアーキテクチャである。ItaniumItanium 2に組み込まれている。

特徴として、アプリケーションバイナリに同時実行する命令を書きこむことによって、アーキテクチャのレベルでアプリケーションの実行効率を向上することができる。

また、IA-64に対してPentiumCeleronなどの32ビットマイクロプロセッサのアーキテクチャのことをIA-32と言う。

アーキテクチャ

主流となっているアウト・オブ・オーダー実行設計では、複雑なデコーダシステムがパイプラインに入ってきた命令を調べ、並行して実行できる命令を選んで実行していく。

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本の82ビット浮動小数点レジスタと128本の64ビットレジスタという非常に多くのレジスタを定義している。 IA-64はこの大量のレジスタをRegister Stack Engineを使ったレジスタローテーションという手法で使用する。 他のプロセッサで見られるspill/fillやウィンドウ機構よりもItaniumの機構は優れている。 レジスタローテーションとプレディケーションの組み合わせにより、ループを自動的に展開して実行することができる。

命令セット

本アーキテクチャはマルチメディア演算や浮動小数点演算に関する命令も用意している。

典型的なVLIWではロング命令ワードの各サブ命令の位置が特定の機能ユニットに対応しているが、Itaniumではサブ命令の配置についていくつかの組み合わせ(バンドル)を用意していて、その中にはシリアル実行モードとパラレル実行モードのバランスをとるものもある。 バンドルのエンコーディングには将来のIA-64の拡張のために空きがある。 加えて、Itaniumは個別に設定可能なpredicateレジスタを持っており、各命令について実行時に出力するか否かを決定できる。

Itaniumは、起動した時点ではいくつかの命令実行機能が動作しないようになっている。 ブートストラップが実行されるとまずEFI(Extensible Firmware Interface)がロードされ、追加の命令がチップ内のメモリに格納される。 続いてプロセッサモード(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プロセッサではIA-32エミュレーション機能を削除するのではないかと予測される。 しかし、IA-32のためのハードウェアはItanium 2のトランジスタ数のわずか1%未満しか使っていないので、削除したところでほとんど意味はない。

競争相手

他の64ビットアーキテクチャはIA-64よりも古くから実用化されているが、すでに市場から姿を消そうとしている(MIPSAlphaPA-RISC)。64ビットサーバおよびワークステーション市場で残っている競争相手はAMDAMD64アーキテクチャとIBMのPOWERアーキテクチャ、サンのUltraSparcアーキテクチャなどである。

AMD64が市場に快く迎えられたため、インテルは新しいXeonIA-32を拡張したEM64Tを採用した。 その命令セットはAMD64と大部分共通である。

関連項目