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

Skylakeアーキテクチャの謎 その2

~5命令デコーダと6命令uOPキャッシュ

Core MA以来の大幅なフロントエンドアーキテクチャ改革

 Intelの最新のCPUマイクロアーキテクチャ「Skylake(スカイレイク)」は、未だに細部が明確になっていない。しかし、そのアーキテクチャには、当初の予想よりはるかに大きな拡張が加えられている。本来的には、IntelのCPUアーキテクチャ史上の大きなステップとして宣伝されてしかるべき拡張だ。

 中でも大きな拡張は、SkylakeのフロントエンドのIA命令デコーダが、5デコーダユニットの構成になっている点だ。これは、Intel CPUの系譜の中で、非常に大きな拡張だ。命令デコードは、言ってみれば、CPUの入り口。命令デコードの帯域が拡張されると、その下の実行パイプラインで並列実行できる命令数が増え、サイクル当たりの命令実行数「IPC(Instruction-per-Clock)」が増える。命令デコード数は、CPUにとって最重要要素の1つで、4命令デコードから5命令デコードに変わったことは大事件だ。

 Intel CPUは、Pentium III/Baniasの世代で3命令デコードのアーキテクチャを採用していた。それが、2006年の初代「Core Microarchitecture(Core MA)」の「Merom(メロン)」世代で4命令デコードに拡張された。この拡張は、IntelがCPUブランド名を変えるほどの、大きな変化だった。それ以来、Intelの高性能CPUは、4命令デコードアーキテクチャを堅持してきた。その間のフロントエンドの大きな拡張は、Sandy Bridgeで加わったuOP(マイクロオプス)キャッシュ程度だった。

 4命令デコードから5命令デコードへ、Skylakeの命令デコーダは、Merom以来のフロントエンドアーキテクチャの根本的な拡張となる。2006年から9年振りのフロントエンドの拡張だ。CPUアーキテクチャ的に見ればこの拡張は、Core MAの時のように大々的に謳われていいはずなのに、そうなっていない。そもそも、IntelのSkylakeアーキテクチャのスライドには、5命令デコードと明記されていない。まるで、Intelは、これだけ重要なアーキテクチャ拡張を隠そうとしているかのようだ。

Intel CPUのフロントエンドアーキテクチャの変遷
PDF版はこちら
Skylakeダイ
Skylakeマイクロアーキテクチャ

従来の命令デコーダをさらに拡張

 Skylakeの命令デコーダは、複雑命令をデコードできる「コンプレックスデコーダ(Complex Decoder)」が1個に、シンプル命令だけをデコードできるシンプルデコーダ(Simple Decoder)が4個の組み合わせだ。従来は、コンプレックスデコーダが1に、シンプルデコーダが3の組み合わせだった。Skylakeでは、シンプルデコーダが1個増えた。

 コンプレックスデコーダはシンプル命令もデコードできる。そのため、Skylakeでは、各サイクルに、最大で5個のIAアーキテクチャル命令をデコードし、5個の内部命令「uOP(Micro-Operations)」を実行パイプラインに発行できる。

 ちなみに、デコードステージにおいて、コンプレックスデコーダを増やすという選択は、Skylakeでも採られなかった。あるCPUメーカーのアーキテクトは「x86業界では、命令並列性を最大に発揮できるのはシンプル命令の時だけということが、暗黙の了解となっている。複雑命令では、並列化が難しいため、デコーダを複雑にするだけの意味があるかどうかは疑わしい」とその背景を分析する。

 実際には、可変長で命令フォーマットが複雑でプリフィックスが多いx86命令の場合、技術的に最も難しいことは、命令のデコードの前段階の命令の切り出しだ。各アーキテクチャル命令の頭がどのバイトにあるのかを判別することが難しい。命令数が増えるほど難しくなり、またレングスチェンジプリフィックスなどが付くと、切り出しアルゴリズム自体が働かなくなったりする。CPUアーキテクチャによっては、L1命令キャッシュに取り込む段階で命令の切り出しを行なう場合もある。このあたりをSkylakeでどう解決しているのかは、まだ分からない。

 また、Skylakeでは、2個のアーキテクチャル命令を複合した1個のuOPに融合させる「Macro-Fusion」も引き続きサポートしている。そのため、Macro-Fusionが可能な命令ペアが来た場合は、最大で6個のアーキテクチャル命令をデコードできるはずだ。uOPsの出力は、Macro-Fusionによって1個減るため、各サイクルに5個のuOPsとなる。

 また、Skylakeでは、演算とロード/ストアの複合したCISC(Complex Instruction Set Computer)型命令を、1個のuOPに変換するMicro-OPs Fusionも継続してサポートしている。そのため、実際にはデコーダから出力されるuOPsのある程度は、融合されたFused uOPsになる。デコーダからのuOPsの出力は5個/サイクル帯域だが、ディスパッチステージから実行ユニットへとイシューされるuOPsの数はさらに増える。

大幅に強化されたSkylakeのuOPキャッシュ

 Skylakeでは、デコード後のuOPsを保持する「uOPキャッシュ」も継続して実装している。複雑なIA命令からのデコードをスキップして、デコード済みのuOPsをキャッシュすることで、効率的な命令フィードを実現する。電力消費の多い命令デコードをスキップするため、省電力面での効果も大きい。uOPキャッシュはx86/x64系アーキテクチャのCPUでは、性能と電力の両面で重要な役割を果たしている。

 命令デコードの拡張と同様に、uOPキャッシュにもSkylakeでは大きな拡張が加えられている。Skylakeでは、uOPキャッシュにヒットした場合は、最大で6個のuOPを実行パイプラインに発行することができる。命令デコーダが5ワイドに拡張されただけでなく、実行パイプラインへの命令フィードは6ワイドに拡張されている。

フロントエンドからのuOPs発行は、従来の4 uOPsから6 uOPsへと1.5倍になった。図は一部推測を含む
PDF版はこちら

 Intelによると、Skylakeでは、uOPキャッシュからのuOPsフェッチは最大6 uOPs/サイクルとなっている。Sandy BridgeやHaswellなど従来アーキテクチャでは、uOPキャッシュからのフェッチは4 uOPs/サイクルだった。この部分の帯域は、1.5倍に増えた。デコーダ列からのuOP出力は、最大で5 uOP/サイクルなので、uOPキャッシュにヒットした場合の6 uOPs/サイクルの方が、パイプラインの下段に対するuOPの供給はより多いことになる。

 CPUの命令デコーダは、そもそも上流の命令キャッシュからのフェッチウィンドウに制約されている。キャッシュから命令を取り込む命令フェッチウィンドウが大きいと、電力消費が大きくなり、ムダも増える。Intel CPUは、16-byteずつキャッシュから読み込んでデコードする、16-byteフェッチウィンドウをこれまで採用して来た。Skylakeでも、命令フェッチは16-byteウィンドウのまま据え置かれていると見られる。フェッチウィンドウが狭い上に、IA命令セットの場合は、命令長が可変であるため、命令フェッチウィンドウからフェッチできる命令数の予測がしにくい。

 それに対して、デコーダ下のレベル0キャッシュであるuOPキャッシュには、こうした制約がない。デコーダからのuOPs出力をキャッシュするため、フェッチ帯域の制約がない。ただし、IntelのuOPキャッシュは、L1命令キャッシュをマップするヒットロジックを採用している。この点は、内部命令のキャッシュでも、Pentium 4のトレースキャッシュと大きく異なる点で、制御がよりシンプルになっている。

 Intelのアーキテクトによると、Sandy Bridge/Haswell系では、32-byteのフェッチウィンドウの単位でuOPキャッシュにマップしていた。それに対して、今回のSkylakeの場合、uOPキャッシュは64-byteフェッチウィンドウ分をマップできるという。実際のフェッチウィンドウよりもワイドな命令フェッチウィンドウの粒度でuOPsをキャッシュすることで、最大6 uOPs/サイクルの命令フィードができるようになったという。

謎が残るSkylakeアーキテクチャと性能

 このように、Skylakeのフロントエンドは、uOPキャッシュによって、命令デコードをスキップできるだけでなく、仮想的に命令フェッチ帯域を増やすことができる構造になっている。また、IntelのuOPは伝統的に固定長であるため、キャッシュラインに格納できる命令数も固定される(ただし、実際に格納される命令数は、対応するL1命令キャッシュからのフェッチウィンドウに含まれる命令数に制約される)。

 uOPキャッシュヒット時の命令フィードの帯域が、従来のHaswell系の1.5倍に増えたSkylake。そう考えると、IntelがSkylakeで、アウトオブオーダリソースを大幅に強化した理由も納得できる。アウトオブオーダエンジンに対して供給できる命令数/サイクルが大幅に増えたことで、アウトオブオーダのためのハードウェアリソースも増やす必要が出た。IPC(Instruction-per-Clock)を高めるために、それらのバランスが必要だった。

 ところが、Skylakeのベンチマークの結果は、1.5倍の命令帯域という拡張に見合う数字に見えない。Skylakeの秘密は、このあたりにありそうだ。Skylakeのアーキテクチャ拡張の目的は、もしかすると、従来のようなCPU性能の向上ではなく、微細化したプロセスでの生産性の向上にあるのかも知れない。

(後藤 弘茂 (Hiroshige Goto)E-mail