後藤弘茂のWeekly海外ニュース

Mercedは750MHz程度で登場か?


●リッチなリッチなレジスタ

 IA-64には、さまざまな新技術がオンパレード状態で盛り込まれている。もっとも、そのアイディアのいくつかは、じつは、以前からあるものだ。これまで、どうしても採用できなかった技術だったのが、IA-64でリソースがリッチになったために、いよいよ採用できるようになったものもある。

 まず、IA-64セットアーキテクチャでリッチなのは、膨大なレジスタだ。整数レジスタを128本(64ビット長)、浮動小数点レジスタを128本(82ビット)も抱える。これがどれくらいリッチかと言うと、x86の8本+8本の16倍、通常のRISCプロセッサの32本+32本の4倍だ。もっとも、P6(Pentium Pro/II/III)アーキテクチャや最先端RISCでは、物理レジスタはレジスタネーム以上の数を持っていて、それをリネーミングして割り当てていたた。そのため、実際には差はもう少し小さい。しかし、IA-64には、コンパイラ側が直接アクセスできるレジスタのネーム空間が広がったという利点がある。これは、IA-64の、コンパイラ側での並列化を進めるというアーキテクチャを活かすものだ。

 レジスタが増えたのは、MPUが高速化するにつれて大きくなったメモリレイテンシを軽減するためと、並列実行する命令が増えると問題になるレジスタの競合を軽減するためだ。128本という途方もない数は、将来、実行ユニットなどをさらに増やした場合でも効率的に並列化をするための余裕なのかもしれない。

 もっとも、大盤振る舞いのレジスタだが、ケチった部分もある。それは、IA-32専用のレジスタは持たずにIA-64のレジスタを共有するスタイルにしたことだ。業界専門誌のMicroprocessor Reportは、IA-64は、IA-32のレジスタを物理的に別個に持つと予測していた。これは、レジスタ切り替えのオーバーヘッドを抑えるためには別に持った方が合理的だからだ。しかし、Intelは盲腸であるIA-32にはそこまでサービスしなかったようだ。


●分岐をなくしてしまうプレディケーション

 Mercedは、内部命令で6~8個を同時発行可能で、それに見合うだけの実行ユニットを持つと言われている。しかし、MPUに実行ユニットを多く搭載しても、その実行ユニットが常にビジーになるように命令を供給できないと性能は出ない。その場合、現在のプロセッサでもっとも障害になっているのは、条件分岐だ。分岐すると、それまでパイプラインで行なっていた処理をいったん止めて、分岐先をフェッチする振り出しから始めなくてはならない。パイプラインがいったん止まってしまうため、このロスは大きい。

 そこで、現在のMPUは、ハードウェアによる動的な分岐予測で、分岐の可能性を判断、可能性が高い方をとりあえず実行していた。ところが、この方法も予測がいったん外れると、結局、パイプラインが止まってしまう。そして、予測精度は、いくら高めても完全にはできないという問題があった。

 そこで、IA-64では、プレディケーションという機構を新たに加えた。これは、すごく簡単な仕組みで、分岐命令が来たら、分岐する方と分岐しない方のふたつのパスをどちらも実行。そして、分岐条件が成立したら、外れた方のパスはそのまま捨てて、正しい方のパスだけを続けるというものだ。プレディケーションは、CMP命令を使い、条件が成立したかどうかは専用のプレディケーションレジスタに収める。

 この太っ腹な方式なら、分岐がどうなろうがいっこうに構わない。どっちも実行するのだから、事実上、分岐はなくなってしまうわけだ。もっともIA-64でも完全に分岐命令をなくすことができるわけではないらしく、Intelの資料ではプレディケーションが半分の分岐命令をなくすとしている。もっとも、これだけでもかなりパフォーマンスは上がるはずだ。ちなみに、IA-64では動的な分岐予測ハードウェアと、静的な分岐予測も備える。


●昔からあるアイディアがようやく現実に

 効果てきめんなプレディケーションだが、このアイディアは、どうやらMPU開発者なら誰でも考えつくことらしい。じつは、7年ほど前にあるRISCプロセッサのエンジニアに取材した時に、似たような手法について聞いたことがあるし、実装したチップもあるという。完全に新しいアイディアというわけではないようだ。

 しかし、これまでは量産MPUで、ここまで完全な形で採用されたことはなかった。それは、プレディケートしようとすると、膨大なハードウェアリソースが必要となるからだという。分岐した2つのパスを同時に実行してゆかなければならないのだから、当然の話だろう。しかも、1回の分岐だけならまだしも、分岐命令のあとにさらに分岐命令が来てといった具合に重なると、どんどん必要なリソースが増えてしまう。そのため、量産MPUが経済的に採用できる技術ではなかったと思われる。

 逆に言えば、IA-64アーキテクチャがプレディケーションを採用したということは、IA-64プロセッサでは、ハードウェアリソースがそれだけリッチになることを前提としているということだ。ただし、それでもプレディケーションの効果に関しては、IA-64プロセッサによって異なる可能性がある。IA-64では64個のプレディケーションレジスタで表現できる限りの分岐をサポートできる。しかし、Mercedのリソースの限界があるので、実際にプレディケートしたパスをすべて並列に実行できるかどうかわからない。ただし、第2世代のIA-64プロセッサ「McKinley」では実行ユニットが増えるので、プレディケーションの性能もアップするかもしれない。


●データスペキュレーションでメモリレイテンシを隠す

 プレディケーションと並ぶ、IA-64アーキテクチャの大きな特徴はスペキュレーション(投機実行)だ。スペキュレーションは、今の最先端MPUでも普通に搭載する機能だが、IA-64が違うのは、2つのタイプのスペキュレーションをサポートすることだ。ひとつは従来からあるコントロールスペキュレーションで、もうひとつは新しいデータスペキュレーションだ。

 後者は、ロード命令の投機実行を行なうもので、IA-64では、コンパイラがロード命令をストア命令や分岐命令の前に出してしまう。ロード命令がロードするデータが使用時にバリッドかどうかが、コンパイル時点でわからない場合は、これまでこうした投機実行はできなかった。しかし、IA-64では、ロード命令は可能な限り前に出すことができる。これは、レジスタにロードしたデータが有効かどうかをチェックする命令を加えたためで、ロードしたデータを使う命令の前にチェックすればいい。

 データの投機実行が重要なのは、ロードのレイテンシが大きいからだ。今のMPUは、ほとんどの演算命令は1サイクルで実行できるが、メモリアクセスだけはレイテンシがある。IA-64のガイドでは、ロード命令は、いちばん近いレベルのキャッシュからでも2サイクルのレイテンシがあると仮定されている。そこで、ロード命令をできるだけ前もって実行してしまうことで、そのレイテンシを隠そうとしているわけだ。そうすれば、ロードしたデータを使う命令を待たせる必要がなくなり、パフォーマンスが上がる。


●レジスタローテイションでループを高速化

 IA-64アーキテクチャの3つめの特徴は、何度も実行されるインナーループの高速化だ。オーバーラップで実行できないループの繰り返し(イタレーション)は、高速化の障害だった。つまり、ループを並列化できずに、シリアルに繰り返さなければならないからだ。

 これを解決するために、IA-64ではレジスタローテイションという手法で、ソフトウェアパイプライニングをできるようにする。これは、ループのひとつのイタレーションが終了する前に、次のイタレーションをオーバーラップして始めることができる技術だ。この場合、ループ内で使うレジスタが重複してしまうわけだが、それはレジスタをリネーミングして、同じレジスタネームで複数のレジスタをイタレーションごとに使い分けることで解決する。

 IA-64では、これをレジスタローテイションと呼び、1つのフレーム内の複数のレジスタが、ローティングしてひとつのレジスタネームに割り当てられる。ひとつのイタレーションがあるレジスタを使うと、次のイタレーションには同じレジスタネームで次のレジスタが割り当てられる。IA-64では、この手法で、1サイクルで1イタレーションのスループットを実現するようだ。ループの高速化は、これまではループの展開で行なってきた。IA-64の手法は、それよりもシンプルでオーバーヘッドが少なくなるという。

 IA-64では、このレジスタローティングに見られるように、非常に高度なレジスタの制御を行なうのが特徴になっているようだ。IA-64では、新たにレジスタスタックフレームという仕組みが取りれられた。これは、一群のレジスタをフレームとしてある特定の用途に割り当てることができる。フレームのサイズを変えたりリネーミングもできる。これは、プロシージャコールなどでレジスタの退避が必要な場合に、別なフレームを新しいプロシージャに割り当てるといったカタチでも使われる。


●コンパイラの性能向上も期待

 このほかに目立つのは、コンパイラが命令バンドルにブランチヒントやキャッシュヒントを埋め込める点だ。ブランチヒントは、いわゆる静的な分岐予測情報をMPUに与えるほか、動的な分岐予測ハードウェアを使う、分岐先をプリフェッチするといった指示もMPUに与える。キャッシュヒントは、ロードやストア、フェッチなどのメモリアクセスの際に、キャッシュの階層を意識して、どのキャッシュに取り込むかを指示できる。ちなみに、Mercedは、チップ内蔵(オンダイ)の0次キャッシュと1次キャッシュ、外付け(パッケージ内蔵)の2次キャッシュの3階層のキャッシュ構造になると発表されている。

 ただし、さまざまな高速化技術を取り込む一方、IA-64では命令セットやデータタイプの拡張はできる限り避けた。例えば、倍精度浮動小数点のSIMD演算などは追加されていない。そういう意味では、ごくごく大人しい拡張だ。

 IA-64は、新しい高速化技術を盛りだくさん取り込んだアーキテクチャで、パフォーマンスを向上できる可能性が非常に大きそうだ。特に、ハードウェアからソフトウェア(コンパイラ)に処理を移したことで、コンパイラ次第で性能をさらに引き出せるようになった。以前、あるRISCメーカーのコンパイラ技術者に話を聞いたときに、コンパイラ技術だけでも年に1.2~1.3倍の性能向上が可能だと言っていた。それが本当なら、IA-64では、それ以上にコンパイラでの性能向上ができるかもしれない。面白いことに、MPUのパフォーマンスが上がると、コンパイルにかかる時間も短縮されるので、より高度なコンパイルができるようになる。つまり、相乗効果でコンパイラによる性能向上がされてゆくのだという。


●Mercedは750MHzで登場か?

 しかし、現実のプロセッサであるMercedがどれだけの性能になるかは、まだわからない。IA-64の最初の落とし子となるMercedが、IA-64のアーキテクチャ上の可能性をフルに活かせるかどうかは未知数だ。事実、Intelは、Mercedのパフォーマンスに対する表現を微妙にトーンダウンして、トップクラスの性能という言い方に変えている。

 まず、Mercedの動作周波数だが、これはIA-32の次期プロセッサの「Foster」が1GHz以上だとすでに発表しているのに、MercedはGHzを超えるという言い方はしていない。Intelの資料ではMercedの単精度浮動小数点演算性能はピークで6GFLOPSになっており、8個の単精度演算を並列実行できるMercedのインプリメンテーションから逆算すると、現在想定している動作周波数は750MHzであることがわかる。Pentium III Xeonの最終的なクロックが800MHzと言われていることから考えると、このクロックは決していい数字ではない。

 しかも、1年半後には、性能が2倍のMcKinleyが迫っているわけで、それならMcKinleyまで待とうとメーカーやユーザーが考えてもおかしくない。McKinleyではクロックは1GHz以上、実行ユニットは増え、大規模な2次キャッシュもオンダイに統合、さらにバスの帯域はMercedの3倍になると発表されている。しかも、McKinleyのすぐあとに、McKinleyの0.13ミクロン版が、ハイパフォーマンス版の「Madison(マディソン:コード名)」と、高プライスパフォーマンス版の「Deerfield(ディアフィールド:コード名)」をそろえて控えているとあってはなおさらだ。本命はMcKinleyファミリ、Mercedはそのプロローグということなのだろうか。

□関連記事
【6月1日】Merced上のx86ソフトのパフォーマンスはPentium III相当か
http://pc.watch.impress.co.jp/docs/article/990601/kaigai01.htm
【5月28日】ついにベールを脱いだIA-64アーキテクチャ
http://pc.watch.impress.co.jp/docs/article/990528/kaigai01.htm


バックナンバー

('99年6月3日)

[Reported by 後藤 弘茂]


【PC Watchホームページ】


ウォッチ編集部内PC Watch担当pc-watch-info@impress.co.jp