|
●ポラックの法則を破るために
まず、昨日のコラムでおかしな点があった。ポラック氏の法則の表で単位が「mm」が「平方mm」になっていた。これは、もとの原稿ではmmだったのだが、編集部で単位の表記を統一した際のミスだ。Web上の記事はもう訂正したが、改めて、ポラックの法則の表を掲載すると次のようになる。
プロセス | 旧CPU | 面積 | 新CPU | 面積 | 面積比 |
---|---|---|---|---|---|
1.0μm | i386 | 6.5mm | i486 | 11.5mm | 3.1 |
0.7μm | i486 | 9.5mm | Pentium | 17mm | 3.2 |
0.5μm | Pentium | 12.2mm | Pentium Pro | 17.3mm | 2.1 |
0.18μm | Pentium III | 10.3mm | Pentium 4 | 14.7mm | 2 |
面積の部分の数値は何mm角に相当するかを示しているので、実際の面積はこの数値を二乗したものになる。例えば、Pentium Pro(P6)は約17.3mm角で約306平方mmだった。だから、12.2mm角のPentium(P54C)の約148平方mmの約2.1倍の面積になるわけだ。
で、この法則が示しているのは、これまでIntelはトランジスタとダイサイズをふんだんに使って性能を上げてきたが、それは決して効率的なものではなかったということだ。その結果、CPUの発熱は核反応炉に近づいてしまっている。
では、どうやって電力消費の面から見て効率的なアーキテクチャにするのか。前回のコラムでは、Intelのパット・ゲルシンガー副社長兼CTO(Intel Architecture Group)が説明した解決策のうち、大容量L2キャッシュを搭載する方向性について説明した。しかし、それだけでは足りない。効率的なプロセッサにするには、さまざまな手法をミックスさせる必要がある。
ひとつは、パイプラインの効率をより高めることだとゲルシンガー氏は説明する。つまり、同じパイプラインでもより効率よく稼働させることができればいいわけだ。
CPUの消費電力が最大になるのは、パイプラインがフルで全ユニットがビジーの場合だ。そして、サーマルソリューションと電力供給はそのマックス電力に合わせなければならない。ところが、実際にはマックス電力を使うアプリケーションは少ないわけで、効率は非常に悪い。現状では、パイプラインをワイドにしたり深くしたりするほど、どんどん非効率になっているという。
この問題を解決するには、実行コアの性能に対する効率を高めるようにすればいいとゲルシンガー氏は説明する。つまり、ロジックをがんがん増やして性能を上げるのではなく、最小のロジックで性能を上げるようにすればいいと。
●次の波はスレッドレベルパラレリズム
そこで登場するのが、「スレッドレベルパラレリズム(TLP:Thread-Level Parallelism)」とか「マルチスレッディング(Multithreading)」と呼ばれるテクニックだ。これは、'99年のCPU関連カンファレンス「Microprocessor Forum」で大いに話題になった技術で、CPUコアが複数のスレッドを並列に実行できるようにするものだ。
これまでのCPUは、異なるスレッドの処理を並列に実行することはできなかった。どれだけ演算器を持っていても、一度に1つのスレッドしか実行できなかったのだ。しかし、実際にはサーバー&ワークステーションではマルチスレッドで処理している場合が多い。そこで、CPU内部で複数のスレッドの処理を並列に実行できるようにして性能を向上させようというTLPがこの2年の新しい潮流となっている。
このTLPをもっともラディカルに採用するアーキテクチャがCompaqの「Alpha EV8」で、このCPUは最大4個のスレッドを管理する「Simultaneous Multithreading(SMT)」と呼ぶ技術を採用する。EV8のSMTでは、CPUは仮想的に4つの「TPU(Tread Processing Unit)」を持ち、最大4スレッドを並列に実行する。しかし、これは個別のCPUコアがあるのではなく、CPUのリソースをフレキシブルに各スレッドに振り分けて、効果的な並列処理を行なう。つまり、EV8では、複数のスレッドを実行している場合にはレジスタや実行ユニットなどCPUリソースは利用できるものからどんどん各スレッドに割り当てられる。一方、スレッドが1つしか走っていない時には、そのスレッドがCPUのリソースをフルに使うことで性能を発揮できる。つまり、CPUリソースが無駄なく使われるというわけだ。
ゲルシンガー氏の説明によると、IntelもどうやらこのEV8と似たようなアプローチを考えているらしい。TLPの実装はハードウェアリソースが大量に必要になるように見えるが、意外とそうでもないようだ。ゲルシンガー氏によると、Intelの研究では5~10%のロジックを加えることで、CPUのスループットが20~40%向上するという。つまり、消費電力の増大は10%以下で、最大40%性能が上がる、オトクな技術というわけだ。考え方としては、現状のアーキテクチャではリソースがあってもそれを効率的に使えていないのだから、TLPの採用でそのリソースを効率的に使えるようにしようというアプローチだと思われる。
●投機マルチスレッディングで性能を上げる
TLPの利点は、IA-64のような命令レベルパラレリズム(Instruction-Level Parallelism:ILP)と違って、既存のコードでそのままで効率を高められることだ。しかし、プログラムががんがんとマルチスレッドで走ってないと効果がないという難点もある。そうなると、クライアント側ではどうなのかという疑問もあるが、プログラムがマルチスレッドで走っていない場合でも「投機マルチスレッディング(Speculative Multithreading)」というテクニックで性能を向上させることができるという。
これはゲルシンガー氏の説明ではなく、Intel Microprocessor Research Labs(MRL)のフレッド・ポラック(Fred Pollack)ディレクタ兼Intel Fellowのプレゼンテーションの中にあったのだが、Intelはどうやら投機マルチスレッディングで、プログラムをマルチスレッドに分解してしまうというアプローチも考えているようだ。
例えば、callで飛んだ先を実行している時に、別スレッドでcallから先の命令ストリームを実行する。あるいは、ループの反復をそれぞれ別スレッドに分けて並列に実行してしまう。または、命令ストリームの先の部分を別スレッドで先に実行してしまう。つまり、スレッドに分解して並列に実行してしまうことで、プログラム実行のスループットを上げようというわけだ。
ポラック氏によると、マルチスレッディングはメモリレイテンシの隠蔽にも役立つという。それは、あるスレッドがデータ待ちをしている間も、CPUは他スレッドを走らせることができるからだ。それから、投機マルチスレッディングがミスした場合も、データはキャッシュにすでに取り込んであるので再実行は速くなるという。
●バリュー予測でさらに並列度をあげる
それから、パイプラインの効率を高めるその他のアプローチには、CPUの予測精度を上げて、意味のない投機実行を減らすこともある。現在の投機実行プロセッサは、投機実行したものの予測ミスで投機実行したパスを破棄しているケースが結構ある。しかし、予測精度を上げたり、あるいは、予測が不確かな場合には投機実行をしないで、他のスレッドが実行ユニットを有効に使える場合にはそちらにリソースを渡すといったことをすればこうしたムダは減るという。つまり、TLPを採用すれば、その分投機実行をもっと確実なものだけに絞れるので、性能に対する電力の効率も上がるというわけだ。
また、ポラック氏は、バリュー予測(Value Prediction)というテクニックも挙げている。これまでのCPUの予測機能は、条件分岐で分岐が成立するかどうかを予測する、コントロールフローの予測だった。しかし、これからは演算結果やアドレスやフラッグの予測をしてしまうバリュー予測、つまりデータフローの予測の採用が有効だという。データバリューを予測することで、データディペンデンシを取り去り、より効率的な並列実行を可能にするというわけだ。CPUの効率化のテクニックというのは、まだまだ尽きずに出てくるようだ。だが、マルチスレッディングやバリュー予測の実装はすぐにはいかない。おそらく、その前に、「チップマルチプロセッサ(CMP:Chip MultiProcessor)」が来るだろう。これについては次のコラムでレポートする。
(2001年2月8日)
[Reported by 後藤 弘茂]