米インテル社と米ヒューレット・パッカード社は5月26日(現地時間)、IA-64のアプリケーション開発者向けに『IA-64
Application Developer's Architecture Guide(ADAG)』および『IA-64 Application ISA
Guide(AIG) 1.0』が公開した。これらのドキュメントは、IA-64向けのアプリケーションを開発するための命令セットなどを解説したもので、初めてIA-64の命令コードやレジスタ構成などが明らかになっている。
インテルは、'94年にHPと共同でIA-64を開発中であることを発表して以来、開発者向けのセミナーなどで小出しではあるもののアーキテクチャの概要などは発表してきた。しかし、今回の発表まで命令コードやレジスタ構成などについては明らかにしていない。
IA-64を初めて採用する『Merced(開発コード名)』を発表する予定の2000年後半まで約1年に迫ったことから、アプリケーションベンダのIA-64への対応を促進する目的で公開されたものと思われる。なお、ADAGとAIGはあくまでアプリケーション開発者向けのドキュメントであり、OSやコンパイラを開発するための特権命令などについては明記されていない。
すでに公開済みの内容を含め、ADAGおよびAIGで明らかになったIA-64の概要を見てみよう。
IA-64では、すでに明らかになっているように3つの命令が組み合わされた状態(バンドルと呼ぶ)がフェッチの基本単位となる(図1)。バンドルの長さは128bitで、41bit長の命令が3つと、実行ユニットの組み合わせを示す5bitの“テンプレート”と呼ぶフラグの合計128bitで構成される。
命令タイプ |
説明 |
実行ユニット |
A |
整数論理演算命令 |
IユニットまたはMユニット |
I |
非論理の整数演算命令 |
Iユニット |
M |
メモリ参照命令 |
Mユニット |
F |
浮動小数点演算命令 |
Fユニット |
B |
分岐命令 |
Bユニット |
L+X |
拡張命令 |
Iユニット |
図1:バンドルのフォーマット
実行ユニットは、Iユニット、Mユニット、Fユニット、Bユニットの4種類が用意されており、命令タイプにより使用する実行ユニットが異なる(表1)。
127 |
87 |
86 |
46 |
45 |
5 |
4 |
0 |
命令Slot 2 |
命令Slot 1 |
命令Slot 0 |
テンプレート |
||||
41bit |
41bit |
41bit |
5bit |
表1:命令タイプと実行ユニットの関係
テンプレートは、実行ユニットの組み合わせを示す4bitと1bitの“ストップビット”から構成される。ストップビットは、その後ろの命令と依存関係があるかどうかを明示的に示す。このビットにより、現在のバンドルと次のバンドルが並列に実行できるかどうかを判断することが可能だ。テンプレートと実行ユニットの関係をに示す(表2)。通常、このように複数の命令をパックし、実行するようなアーキテクチャ(VLIW型のアーキテクチャ)では、パックする命令数と実行ユニットの数が密接な関係を持ってしまう。
Template |
Slot 0 |
Slot 1 |
Slot 2 |
00 |
Mユニット |
Iユニット |
Iユニット |
01 |
Mユニット |
Iユニット |
Iユニット |
02 |
Mユニット |
Iユニット |
Iユニット |
03 |
Mユニット |
Iユニット |
Iユニット |
04 |
Mユニット |
Lユニット |
Xユニット |
05 |
Mユニット |
Lユニット |
Xユニット |
06 |
|||
07 |
|||
08 |
Mユニット |
Mユニット |
Iユニット |
09 |
Mユニット |
Mユニット | Iユニット |
0A |
Mユニット |
Mユニット |
Iユニット |
0B |
Mユニット |
Mユニット |
Iユニット |
0C |
Mユニット |
Fユニット |
Iユニット |
0D |
Mユニット |
Fユニット |
Iユニット |
0E |
Mユニット |
Mユニット |
Fユニット |
0F |
Mユニット |
Mユニット |
Fユニット |
10 |
Mユニット |
Iユニット |
Bユニット |
11 |
Mユニット |
Iユニット |
Bユニット |
12 |
Mユニット |
Bユニット |
Bユニット |
13 |
Mユニット |
Bユニット |
Bユニット |
14 |
|||
15 |
|||
16 |
Bユニット |
Bユニット |
Bユニット |
17 |
Bユニット |
Bユニット |
Bユニット |
18 |
Mユニット |
Mユニット |
Bユニット |
19 |
Mユニット |
Mユニット |
Bユニット |
1A |
|||
1B |
|||
1C |
Mユニット |
Fユニット |
Bユニット |
1D |
Mユニット |
Fユニット |
Bユニット |
1E |
|||
1F |
*表中太字になっているユニットの後ろに「ストップビット」が立っていることを示す |
表2:テンプレートと実行ユニットの関係
そのため、高速化のために実行ユニットを増やすと、パックする命令の数を変更する必要が生じ、以前のアーキテクチャとの互換性を維持できない、という問題があった。IA-64では、テンプレートを調べることで、複数のバンドルを並列に実行することも可能になるため、実行ユニットの数に左右されないアーキテクチャとなっている。
レジスタは、64bitの整数型レジスタ(GRs)がGR0からGR127の128本、82bitの浮動小数点型レジスタ(FRs)がFR0からFR127の128本、1bitのプレディケイト・レジスタ(PRs)がPR0からPR63の64本、64bitの分岐レジスタ(BRs)がBR0からBR7の8本で構成されている。そのほか、命令ポインタ(IP)、カレント・フレーム・マーカー(CFM)、アプリケーション・レジスタ(ARs)、パフォーマンスモニタ・データ・レジスタ(PMD)、ユーザー・マスク(UM)、CPUIDなどの特定用途用のレジスタも装備されている。
IA-64では、既存のIA-32との互換性も維持しており、IA-32で書かれたプログラムも実行することが可能だ。ただし、IA-64とIA-32のソフトウェア実行は、モードを切り替える必要がある。IA-64モードからIA-32モードへは分岐命令の“br.ia”を、逆にIA-32モードからIA-64モードへはジャンプ命令の“jmpe”を使用する。また、IA-32モード実行時にインターセプト(特権レジスタへのアクセスに対する例外)や例外、ソフトウェア割り込みなどが発生すると、IA-64モードに移行するので、処理後は“rfi”でIA-32モードに戻る。
なお、IA-32モードでは、整数型レジスタのGR8からGR31が整数型レジスタとセグメントレジスタとして、浮動小数点型レジスタのFR8からFR31が浮動小数点型レジスタとマルチメディアレジスタとしてそれぞれ使用される。
そのほか、条件分岐命令などがあった場合、条件結果が判明する前に、条件が真の場合と偽の場合の両方を実行し、結果が判明後に“正しい処理方向”だけを残すという“プレディケイト処理”をサポートするなど、IA-32とは大幅に異なったアーキテクチャを採用している。IA-32では、分岐予測を行ない、どちらか一方を実行していた(投機実行を行なっていた)。
そのため、分岐予測が外れた場合、それまで実行していた処理を捨て、再び正しい処理を行う必要があり、性能低下の原因ともなっていた。IA-64では、プレディケイト処理を採用することで、分岐予測を行うことなく、継続して処理が行なえるわけだ。
IA-64は、コンパイラにより並列処理可能な命令や、メモリ参照によって生じる遅延を発見し、命令を並べ替え、バンドルを作成する。このようにIA-64では、コンパイラの性能によって、命令の並列化がどの程度実現できるかが決まってくる。逆に言えば、コンパイラの性能が向上すれば、同じプロセッサでも性能が大きく向上する可能性があるアーキテクチャといえる。
ここで紹介した以外にも、バイエンディアン(Bi Endian)対応になったことや、CPUIDレジスタに新機能用の予約領域があることなど、ADAGとAIGを読んでいくと次々と新しい発見がある。それらについては、今後発表されるMercedのアーキテクチャなどと合わせて、順次紹介していくこととする。