後藤弘茂のWeekly海外ニュース
フロムスクラッチでCPUを設計するAMDとインクリメンタルなIntel
2017年1月5日 18:50
フロムスクラッチのクリーンなZENの設計
AMDは、次世代CPUマイクロアーキテクチャ「ZEN」において「IPC(Instruction-per-Clock)」を大きく向上させながら、消費電力を抑えたとしている。実際に、ZENはマイクロアーキテクチャ的には、高いIPCと省電力を達成できる要素を備えている。もちろん、その一因は、マイクロアーキテクチャを2スレッドに整数パイプを分割した従来のAMDパフォーマンスCPUのアプローチから、よりスタンダードなシングルスレッド性能重視に戻したことにある。だが、それ以上に、既に実証されている、性能/電力向上のテクニックを取り入れたことも大きい。
ZENマイクロアーキテクチャは、Intelも採用した内部命令(マイクロOPs:Micro-OPs)のキャッシュ「OPキャッシュ」など、高性能化と低電力化に大きな効果があるテクニックを導入。また、Intel同様にSMT(Simultaneous Multithreading)も導入する。パッと見ると、AMD CPUがIntelアーキテクチャで成功した要素を取り入れたように見える。
しかし、ZENには、それらのテクニックを、フロムスクラッチのクリーンなアーキテクチャで実現した利点がある。ZENは、全体的にすっきりとまとまったマイクロアーキテクチャとなっている。一般に、フロムスクラッチの方が、設計リスクはあるが、性能の向上が大きいと言われている。
フロムスクラッチと言っても、継承されている部分もある。浮動小数点演算ユニットをコプロセッサ的にスケジューラレベルで分離する分離する点や、ヴィクテムキャッシュの採用など、AMDの従来の設計思想が受け継がれている。x86命令をコンパウンド型の内部命令(マイクロOPs:Micro-OPs)にいったん変換してから、個々のオペレーション単位の細粒土のマイクロOPに変換する点も、従来のAMDアーキテクチャと似通っている。しかし、細部を見ると、フロムスクラッチで新技術に最適化している部分が見られる。
継承性の強いIntel CPUのマイクロアーキテクチャ
フロムスクラッチであるという点は、ZENの大きな特徴で、Intel系アーキテクチャとの大きな違いとなっている。Intelの高性能CPUのマイクロアーキテクチャは、「Core Microarchitecture(Merom:メロン)」からのアーキテクチャに、継ぎ足し継ぎ足しで来ており、1回もフロムスクラッチへと戻していない。そもそも、Merom自体がPentium IIIアーキテクチャからの拡張だ。そのため、現在のIntel CPUコアは、非常に入り組んだアーキテクチャとなっている。
Intelはこの設計思想について、Nehalem(ネハーレン)の時に説明を行なっている。2010年に米スタンフォード大学の公開講義EE380で、当時のIntelのメインアーキテクトGlenn J. Hinton氏が、設計期間とリスクの増大を避けるために、従来設計への継ぎ足しを選んだと説明した。フロムスクラッチ設計にすれば10~20%のシングルスレッドの性能向上が得られる可能性があったが、それよりも設計期間を短くし、チューニングにより時間をかけることを選択したという。そして、IntelはNehalem以降も、その方式を継承し続けている。
それに対して、AMDは6~7年に1回、マイクロアーキテクチャをリセットしてフロムスクラッチで開発するというスタイルを取り続けている。下の図はAMDのマイクロアーキテクチャの変遷を示したもので、右から2つ目が2003年のK8、中央が2011年のBulldozer(ブルドーザ)、左から2つ目がBulldozerを改良したSteamroller、左端が今回のZENとなっている。右端は別な開発チームが設計した、省電力コアのBobcat(ボブキャット)だ。こうして見ると、世代毎に、かなり性格が異なるマイクロアーキテクチャとなっていることが分かる。
実際には、K8のベースは、K7マイクロアーキテクチャの継承となっている。また、K8の後にフロムスクラッチの「K9」があったが、キャンセルされている。そのため、厳密には6~7年サイクルのアーキテクチャ刷新ではないが、Intelと比べると高頻度で刷新していることは確かだ。
両社の設計アプローチには、利点と難点がある。AMDのフロムスクラッチ方式には、設計エンジニアリング労力がかかり、新しい問題に直面するリスクも増える。そのため、開発と修正に追われてチューニングに時間をかけられない可能性や、リリース時に期待通りの性能を出せないリスクがある。その反面、クリーンなアーキテクチャとなるため、大胆に性能向上策を取りやすい。
対してIntelの方式は、従来のアーキテクチャに加えて行く形になるため、大胆な変革をしにくい。Intelがかつて指摘したように、フロムスクラッチによる10~20%の性能向上は諦めることになる。しかし、既知の設計を拡張するためリスクが小さく、ソフトウェアの最適化についても変更が少なくて済む。x86系CPUで重要となる、設計チューニングにかける時間も長く取ることができる。
こうして背景の設計思想を概観すると、ZENのチャレンジが見えてくる。フロムスクラッチのCPU設計の常として、アーキテクチャから期待される通りの性能を発揮できるのかどうかという疑問がある。また、アーキテクチャの選択が正しかったのかどうかも、重要だ。実際に、前のBulldozerマイクロアーキテクチャの時は、この2点の両方でつまづいた。
Bulldozerでは、シングルスレッド性能よりもダイエリア当たりのスレッド実行性能を追求した結果、エンドユーザーの性能要求に影響するシングルスレッド性能でIntelに大きく遅れを取った。シングルスレッド性能を求める市場自体は継続していることを見落としていた。また、チューニングも最初の世代では十分ではなかった。しかし、今回のZENでは、AMDはそうした点を反省し、市場要求を見据えて開発している。パフォーマンスチューニングがどれだけ十分かは、市場に出るまでは、まだ未知数だが、今回、AMDはリスクを避けて、導入しやすい方法をできるだけ取っているように見える。例えば、OPキャッシュはIntelの方式にある程度似ているように見える。
ZENマイクロアーキテクチャの強味
AMDのZENで大きく革新されたのは、パイプラインの前半、命令フェッチからデコード、ディスパッチまでのフロントエンド部分だ。分岐予測には、ニューラルネットワークベースの分岐予測ロジックを採用、命令デコーダは4命令デコードで、デコードした内部命令「マイクロオペレーション(マイクロOP:Micro-OP)」をキャッシュするOPキャッシュを加えた。より高い精度で命令ストリームの分岐を予測し、デコードしたマイクロOPをキャッシュして再利用する。分岐ミスのロスを減らし、命令デコードをスキップすることで、性能を引き上げ、同時に消費電力を低減する。
フロントエンドをより詳しく見ると、変化が明確に分かる。AMDの従来アーキテクチャと比較すると、Bulldozerアーキテクチャは命令デコードは4命令デコードだったが、2スレッドのパイプラインで共有していた。Bulldozerを改良したSteamrollerで、命令デコードは2重に拡張されているが、実行パイプ自体が狭く、フェッチ段も制約されていたため効果は限定的だった。下の図でも分かる通り、命令デコーダはバランスが崩れている。ZENでは、4命令デコードで、4整数演算、または4浮動小数点命令実行のバランスの取れたアーキテクチャとなっている。K10世代までのAMDは3命令デコードだった。
対するIntelはSkylake(スカイレイク)以降は5命令デコード(命令フュージョンを含めると6命令)となっている。しかし、x86/x64命令セットの場合は、“運が良ければ3命令以上を並列化できる”といったレベルで、ピークの5命令を実際に並列化できるチャンスはそれほど多くはない。つまり、Intelの方が命令デコード帯域は25%以上広いものの、それによって、単純にIPC(Instruction-per-Clock)が25%高くなるわけではなく、差はより小さい。
ZENのフロントエンド部で目立つのは、OPキャッシュの存在だ。OPキャッシュは、x86/x64系CPU特有の弱点を克服できる、非常に有効なテクニックだ。従来はIntel CPUだけが持っていたマイクロOPのキャッシュを、AMD CPUも備えるようになる。
x86/x64の最大の弱点は命令デコード
x86/x64命令では、命令デコードが設計上の最大の難関となっている。それは、x86/x64がCISC(Complex Instruction Set Computer)型命令で、さらに長年の命令拡張が加わって、極めて複雑な命令セットアーキテクチャ(ISA:Instruction Set Architecture)」となっているからだ。x86/x64命令はもともと可変長で命令長にバリエーションがある上に、命令の前に付けるプリフィックスの積み重ねで、さらに命令長が複雑になっている。
そのため、x86/x64命令では、命令の切れ目を見つけて切り分けることが非常に難しい。決まった命令長のRISC(Reduced Instruction Set Computer)系CPUでは、例えば、32-byte毎に命令の切れ目が来るため、命令を切り出すことが簡単だ。ところが、x86/x64では、命令長のバリエーションがあまりに多いため、簡単に命令を切り分けることができない。そのため、x86/x64命令のCPUは、命令デコードのロジックが複雑になり、デコード段での電力消費が大きくなり、デコードのレイテンシが長くなる。
命令デコードは、x86/x64命令の最大の弱点だ。つまり、x86/x64系CPUでは、命令を並列に実行させることよりも、並列に実行する命令をデコードすることが難しい。そこで、x86/x64系CPUでは、命令デコードの負担を減らす工夫が重要となる。最も望ましいことは、命令デコード自体を行なわなくて済むようにすることだ。
そもそも、高性能なx86/x64 CPUは、x86/x64命令をいったん内部命令マイクロOPに分解する。マイクロOPは、可変長で命令フォーマットが複雑なx86/x64命令とは異なり、通常は固定長で固定フォーマットとなっている。RISCと同様に取り扱いが簡単で、簡単に実行できる。だったら、このマイクロOPをキャッシュすればいい、という発想が当然浮かんでくる。
そこで、x86/x64命令をデコードしたマイクロOPを格納するキャッシュやループバッファの実装が行なわれて来た。マイクロOPを再利用すれば、複雑でレイテンシが長く電力消費が多いx86/x64命令デコードをスキップできる。性能も上がれば、電力もセーブできる。しかし、AMDはこうした機能は備えて来なかった。ZENは、この部分を改良、命令デコードでの電力と性能改善に注力した点が目立つ。