【スペシャル】Pentium 4のマイクロアーキテクチャのすごさ頭脳放談(2/3 ページ)

» 2000年12月01日 05時00分 公開

x86命令のデコードとメインの実行パイプラインが分離

 Pentium 4のアーキテクチャを見るとき、最も「過激」に進化した点を挙げるとすれば、x86命令のデコード・ステージとメインの実行パイプラインを分離したことだろう(命令のデコードについては、本連載の「第1回 Pentium IIIとAthlonなるモノ」を参考のこと)。Pentium IIIまでは、CISCの複雑なx86命令はRISC的な細かなオペレーションに分割され、アウト・オブ・オーダかつ投機的に実行されてきたわけであるが、x86命令のデコードと細かなオペレーション(マイクロオペレーション:μops)の実行は1つのパイプラインの中で処理されてきた。もちろん、命令キャッシュにせよ分岐予測にせよ、x86命令を単位として実現されてきたのであって、μopsはパイプラインの中で現れる一時的な表現でしかなかった。これがPentium 4では、x86命令のデコーダーと、デコード後のオペレーションを動的に実行するパイプラインとが分離され、その間にデコード済みのマイクロオペレーションを記憶しておくためのキャッシュ・メモリ(Pentium 4では「トレース・キャッシュと呼んでいる」を挟んで結合されることになった。

 ともかく外部からフェッチしてくるのはx86命令コードなのであるから、取りあえず最初はx86命令のデコードが行われる。デコード・ステージで作られたマイクロオペレーションは、実行パイプラインへ送られていくが、同時にトレース・キャッシュという、マイクロオペレーションを格納するためのキャッシュ・メモリへも詰め込まれる。実行パイプラインはマイクロオペレーションを実行していくが、その中に分岐がある場合、その分岐の履歴はマイクロオペレーション・ベースのトレース・キャッシュも指すようになっている。もし、トレース・キャッシュに詰め込まれたマイクロオペレーションにヒットすれば、もはやx86命令のデコードは実行されず、直接トレース・キャッシュ内のマイクロオペレーションを使って、メインの実行パイプラインが動作していくのである。つまりx86命令のデコードが省ける分、高速化できるわけだ。もちろん、分岐予測の結果がトレース・キャッシュにヒットしなければ、再びx86命令のデコードが行われることになる。

Pentium 4のブロック図 Pentium 4のブロック図
基本的な構造は、P6アーキテクチャを踏襲しているが、Pentium 4では命令キャッシュの構造が大きく変わっている。また、浮動小数点演算ブロックがパイプライン化されており、高速化が行われている点にも注目したい。

 一般的なプログラムというものは、繰り返し構造の中で多くの時間を消費する。また、頻繁に同一ルーチンが呼ばれることも多い。このような局所性を生かせるケースでは、Pentium 4は、あまりx86命令をデコードしなくともよい。つまり、トレース・キャッシュは非常に有効な手段といえるわけだ。

 Pentium 4におけるx86命令のデコード能力は、過去のプロセッサと比べても遜色はないようだ。1クロックごとに複数のマイクロオペレーションが生成できることになっている。しかし、x86命令には、プログラムは常に頭から順次読んでいかないと正しく解釈できない、という宿命がつきまとう。非常に長いx86命令が連なるとき、どこまでを同じクロック数でデコードできるのかは不明であるが、過去の例からしてもあまり多いとは思えない。これは複雑な命令セット・アーキテクチャを持つCISCとしての宿命的な制約である。過去のx86プロセッサは、どれも多くのオペレーションを同時に実行できる能力と、相対的に貧弱なx86命令のデコード能力のアンバランスで悩んできた。スーパー・スカラー技術の進展により、実行能力がどんどん向上しても、デコードが伴わなくては実効性能は伸びない。

 この問題に対しPentium 4は、トレース・キャッシュに入っているマイクロオペレーションの範囲内ではあるが、デコードしなくて済むというショート・カットを与えたのである。トレース・キャッシュにヒットし、面倒なx86命令をデコードしなくて済む間は、デコード部分はネックとなることなく、実行パイプラインは最大の効率で動作できる。ちなみに実行パイプラインは、6マイクロオペレーションを同時発行、3マイクロオペレーションを同時リタイア(完了)という「太さ」を持つ。もちろん、先ほども触れたが、分岐の履歴、分岐予測機構ともx86命令単位でなくマイクロオペレーション単位での動作になっている(x86命令が同時に3命令をリタイアできるわけではない。また、x86命令が何マイクロオペレーションに変換されるのかについては明らかにされていない)。トレース・キャッシュにヒットしているときこそ、Pentium 4は最大性能を発揮できるのである。

Transmetaのコードモーフィングにも一脈通じる

 このようなPentium 4におけるx86命令のデコード・フロントエンドの分離を見て、すぐに連想されるのがTransmetaのコードモーフィング・ソフトウェアである(コードモーフィングについては、「頭脳放談:第4回 VLIWは世界(プロセッサ)を救うか?」を参照のこと)。Transmetaの場合、x86命令をソフトウェアによりVLIW命令に変換し、主記憶の一部にキャッシングして、それをVLIWで実行する。Pentium 4の場合は、デコーダーはハードウェアであるし、実行形式はVLIWでなくスーパー・スカラーであるが、x86命令を実行しやすい形式に変換した後に保存し、使用する点は一緒である。今後は、x86命令のようなCISC命令を実行する場合には、このようなフロントエンドと実行パイプラインを分離するアプローチ(JavaのJITコンパイラに似ている)が一般化していくように思われる(そうするとx86命令コードそのものがJavaバイト・コードと似たような位置付けになってしまうかもしれない)。

ハイパー・パイプライン化がPentium 4のキー・ポイント

 Pentium 4でのアーキテクチャ改良の2つ目のポイントといえるのが、これから述べるハイパー・パイプライン化である。実に20段というハイパーぶりだ(Pentium IIIは10段)。それも前述のx86命令のデコード部分を含んでいないので、実質的には今までの2倍以上に細かくステージを分けたことになる。

Pentium 4のパイプライン Pentium 4のパイプライン
Pentiumの5段、Pentium IIIの10段に対して、Pentium 4では20段という細かくステージを分けたパイプラインを採用している。

 細かくステージを分けていくということは、それぞれのステージで行うべき仕事が細切れの短い作業になるということだ。ステージの作業が短くなるということは、繰り返しの速度、つまり実行周波数を向上させやすくなる(頭脳放談:第7回 パイプラインと動作クロックのひそかな関係?)。

 Pentium IIIは、1GHzを超えるあたりで、どうも動作周波数は頭打ちぎみで、製造プロセスだけをいくら向上させてもこれ以上は伸びそうにない。どうやら、インテルはこの点の対策を最優先課題としたようだ。インテルによれば、Pentium 4では2GHz超えは2000年第3四半期にも可能だとしており、将来の製造プロセスの発展まで考えると、相当先まで通用できるようにパイプラインを準備したようだ。

 とはいえ、周波数の向上には効果の高いハイパー・パイプライン化であるが、半面、分岐予測が失敗したときなどのペナルティーも大きい。20段もあると、何らかの理由からパイプラインを初期化しなければならない羽目になると、再度パイプラインが詰まるまでに非常に長い時間がかかるからだ。Pentium 4の場合、実に100個以上の命令(μops)が同時にパイプラインの中に存在する可能性があるようだ。一瞬にしてこれらをご破算にして、またパイプラインを詰め直すのは大変なことだ。そのため、分岐予測は相当洗練されたものになっているようだが、それに加えてうまくパイプラインを効率よく回すための小技も使っている。

連続した演算を1クロックの中で行う

 ハイパー・パイプラインということで、一般には1クロックで動作する論理回路の連なりを極力短くしなければならない設計方針であるはずだ。それにもかかわらずPentium 4では、連続する2演算を1クロックで実行してしまうという、これまでPentium系がやってこなかった荒業もあえて投入してきた。要は演算を行うALU(Arithmetic and Logic Unit:算術論理演算装置)だけは、プロセッサの中でさらに2倍速で動かしているようなものだ。

 1クロックで連続する2演算を行うのは、ARMプロセッサなどでも例があるが、これらは全て1命令の枠内である。命令の枠を超えて2つの演算を将棋倒し的に行ってしまうのはかなり過激な方法である。しかし、相互に依存関係のある演算というのは、出現頻度が非常に高いので、これを1クロック内で連続して始末できる可能性があるわけだ。つまり、同時に実行しているように見えるということは、また大きなアドバンテージといえる。

 まぁ、考えてみれば32bitのALUのけた上げ(キャリー)チェーンがクリティカルであるような設計であれば、1クロック内での連続演算は冒険であるが、後述するようにPentium 4では実に128bit幅のデータ・パス(主として扱うデータは倍精度浮動小数点数なので64bitである)を扱う命令まで持っており、それを考えれば32bit幅の演算を2個つなげて64bitとする程度の回路設計だけが特別クリティカルとはいえないだろう。それにしても1.4GHzあるいは1.5GHzといった領域でこれをするのは、まさに力技による高速化技法の極致といえるだろう。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。