元半導体設計屋 筑秋 景のシリコン解体新書
Intelが新EコアSkymontで取り入れた他社とは異なる設計思想
2025年1月22日 06:21
IntelがLunar Lake、Arrow Lakeに採用したCPUアーキテクチャ「Skymont」(Eコア)と「Lion Cove」(Pコア)は、今後の製品にもその進化版が採用される。これらの新アーキテクチャの詳細について解説する。
このマイクロアーキテクチャの開発を始めるにあたり、Intelは目標を設定した。1つ目は、「Meteor Lakeで導入された低電力アイランドであるCrestmontを活用してエネルギー効率を高め、PCのバッテリを長持ちさせる方法を検討する」というものだった。低電力アイランドでの実行は低コストで効率的なコンピューティングを提供するため、そこで実行できるワークロードが多いほど、バッテリの寿命は長くなる。
2つ目は、さまざまなコンテンツを配信できるようにすることだ。今日、より多くのソフトウェアでベクトル演算が一般的ワークロードとして利用されている。ベクトル演算の処理能力を2倍にし、バランスの取れた論理回路で処理し、ボトルネックを少なくすることが2つ目の目標だった。AIもその一部だ。ほとんどのAIワークロードでは、ベクトル命令が使用されるからだ。
3つ目はスケーラビリティだ。Intelがハイブリッドコンピューティングで採用している、Pコア、Eコアのうち、Eコアをより多くスケールアウトするというものになる。これにより、電力の制約を受けずに効率的なスケールアウトが可能になり、コスト面ではエリアにより多くのEコアを配置できることになった。ハイブリッドコンピューティングを採用する3世代目のEコアは、スケーラビリティを推進する方向で進化したということだ。
マイクロアーキテクチャの詳細
最近のCPUマイクロアーキテクチャ改善は、すべて分岐予測から始まる。分岐予測とは「データがどこに行くのか」について指示を出すことだ。これを実行する回路が分岐予測器になる。Skymontでは回路自体を少し大きくすることで、より多くのデータを確実にスキャンすることが可能になった。
Meteor LakeのEコアであるCrestmontでは、128byte予測に移行した。つまり、128byteをスキャンし、次に来る分岐ごとの指示を探す。これについてSkymontでは、信頼性を高めるためにいくつかの点を改善している。
Crestmontでは、特定の境界である128byteごとの境界から開始する必要があり、その半分や4分の1しか予測できない場合もあった。Skymontではこの境界は任意になり、任意の64byteの境界から開始できるようになっている。これをeven-oddと呼んでおり、Even(偶数)アライメント、Odd(奇数)アライメントのどちらからでも開始できる。つまりSkymontは、スキャンをどこから始めても、どのキャッシュラインから始めても、全体を見渡すことが可能で次の指示を迅速に取得できるということになる。
これによりデータフェッチも高速化できる、分岐先が分かっていてアクセスを開始できるからだ。つまり、予測ミスでキャッシュからデータを取り出して他の部分に送信する場合、処理を速く行なうことができる。ここでは最大96命令byteを取得できる。なお、x86は可変長命令ISAであるため、96個の命令ではなく96byte分の命令を取得できるということだ。
サイクルごとに96byteを取得し、それをデコーダに渡す前にバッファにロードするが、そのバッファも50%深くなっている。デコーダに渡す前の、フェッチと分岐予測が大きく進化しているわけだ。
IntelはEコア導入の数世代前からクラスタデコーダを導入し、Tremont、Gracemont、Crestmontに搭載されている。これらの世代では2つの独立した3ワイドデコーダを採用し、それぞれクラスタデコーダが最大3つのx86命令(これも可変長)を見つけることができる。
これに対しSkymontでは3番目のクラスタを追加した。これによりデコードの命令スループットは50%向上し、9ワイドフロントエンドの持続的なデコーダとなった。このクラスタデコーダの導入により、多くの課題を解決して効率化を図ったという。
それまでのクラスタデコーダ導入での検証、経験値が上がっていたことで、9ワイドへの拡張でのタイミングへの悪影響はなく、かなり効率的になっている。Intelでは、クラスタデコーダ方式の構築によりx86の可変長命令に関する業界の議論はすでに終わったと考えているという。
マイクロコードとナノコード
可変長命令での最適化についてよく議論される点について説明しておこう。x86や他のISAでも起こることだが、1つの命令から複数のμopを生成することがある。フェッチして複数の命令にデコードされるということだ。x86では、この複数の命令はマイクロコードになる。マイクロコードROMでマイクロコードに変換され、マイクロコードシーケンサ(演算ユニットを制御するハードウェア)で各ユニットでの実行手順が指示される。
マイクロコードROMには一度に1つのデコーダからしかアクセスできなかったため、1つのクラスタがROMにアクセスしていると、それ以外のクラスタは順番を待って処理する方式となっていた。Intelは、初めてクラスタデコーダを導入した時にこれを改善できると認識はしていた。そこで、Skymontでは、「ナノコード」と呼ばれるものを導入した。
ナノコードにより、クラスタごとにデコーダを配置することができるようになり、一般的なマイクロコードフローと特定のマイクロコードフローのμopsを生成できるようになった。つまり、デコードを並行して続けることができるということだ。
たとえば、gather命令などで、2μops、3μops、10μopsを生成する必要があるという指示を出した場合、クラスタ0はgather μopsを問題なく生成でき、クラスタ1でもgather μopsを生成でき、クラスタ2はアウトオブオーダーの任意のものをデコードし続けられる。つまり、ナノコードは帯域幅を増やし、より信頼性の高いデコードを実現した。そして、クラスタデコードスキームでは、クラスタ0とクラスタ1のgather命令のデコード例のように複製も行なわれ、それに伴うリソースも複製される。
前述の96byteのフェッチは、クラスタごとに32byteのフェッチを行なうため3クラスタで合計96byteとなっている。順当にスケールアウトしている。同じことが、マシンのフロントエンドとバックエンドの間を通るキュー、μopキューにも当てはまる。3番目のクラスタを追加したため、フロントエンドとバックエンドの間のμopバッファリングが50%増え、パフォーマンスが増加したのだ。
次はバックエンドでの改善について説明しよう。フロントエンドからバックエンドまで、GracemontはAlder Lake Eコアで、5ワイドのマイクロアーキテクチャとなっており、サイクルごとに5μopsを割り当てることができた。CrestmontのMeteor Lakeは6ワイドだ。
そしてSkymontでは、9ワイドのフロントエンドを8ワイドに割り当て、サイクルごとに8μopsをマシンのバックエンドに割り当てることができるようにした。また、リタイヤメントも増やしている。当初はサイクルごとに最大8μopsがリタイア可能だったが、現在はサイクルあたり16μopsがリタイアできる。
これは、必ずしもパフォーマンスと直接相関しているわけではないが、リソースの解放が迅速になるとキューを浅くすることが可能になり、必要な回路の容量が減少し、動的消費電力(C-dyn)が削減されることになる。つまり、効率的なリソース管理と電力消費の最適化が実現されるというわけだ。
クリティカル依存チェーン解消とは
理想的なマイクロアーキテクチャでは、クリティカル依存チェーンと呼ばれるものを見つけて処理を進めることになる。クリティカル依存チェーンは、ある命令が別の命令に依存し、その命令がさらに別の命令に依存するという連鎖のことだ。無限のリソースがあれば、この依存チェーンを見つけることができる。だが現実には無限のリソースを使用することはできない。そこで、その依存関係を解消する方法を増やすことで、並列化の進化を目指すことになる。
2つの命令が依存しているように見えても、他の場所からデータを取得できたり、ゼロ検出やイディオムで、ゼロを生成することが分かっている命令がある。これらは依存関係を壊す(断ち切る)一例になる。
ほかにも、ストアから転送されると予測されるロードを受け取るケースがあるが、ここではその接続が分かっているため、実際にはロードデータそのものは供給しなくて済む。受け取り側のμopには、以前のストアデータをフィードするわけだ。
別の例として、x86では、スタックポインタを使って、オフセットを蓄積するESPフォールディングを行なっている。今では、より多くのケースでそれを行なうことができる。
依存関係のある命令同士のつながりを断ち切ることで、並列処理の可能性が上がり、命令の実行を効率化し、待ち時間を短縮する。これにより、命令の実行効率(IPC)が向上し、全体的なパフォーマンスが改善されるわけだ。これがSkymontでのアウトオブオーダーエンジンでの改善だ。つまり、フロントエンドが9ワイドになり、μopの8ワイドの割り当て、16ワイドのリタイアができたので、アウトオブオーダーウィンドウが拡大したことになる。
Alder LakeとRaptor LakeのEコアは、256エントリーアウトオブオーダーだった。Crestmontも同じだ。一方、Skymontでは、約60%拡張され、416エントリーのアウトオブオーダーウィンドウになっている。
それに伴い、スケールアップが必要なリソース、物理レジスタファイル、予約ステーションエントリ、ロードとストアバッファリングなど、Skymontのマイクロアーキテクチャではこれらすべてが拡張されている。最大8命令を同時に発行し、400以上のエントリーROB(Reorder Buffer)で26ディスパッチポートにμopを発行できる。
IntelのEコアに対するアプローチは、他社のヘテロジニアスアーキテクチャとは少し異なっているという。SkymontのEコアでは、「専用の機能はエネルギー効率を向上させる」という指標にもとづいている。スケジューラや実行ユニットを共有することも専用することもできるが、Skymontでは並列実行を採用している。
Skymontには8つの整数ALUがあり、クロックサイクルごとに8つのシングルサイクル演算を実行できる。また、サイクル毎に3つのジャンプと3つのロードを実行できる。アーキテクチャでの対称性を持たせるために、クロック毎に4つのシフターと2つの整数乗算器がある。対称性により特定の処理に偏りが生じにくくなり、性能が安定する。
設計面では、回路設計を簡素化し、開発期間の短縮やコスト削減につなげられ、拡張性の向上にも貢献する。ここでは一般的な、より多くのハードウェアとより多くの並列処理で性能を向上させている。
ベクトル演算は前世代では、浮動小数点演算の場合で128bitのパイプラインが2つあった。そしてSkymontでは4つの128bit浮動小数点パイプラインを採用した。前世代製品では3つの整数SALUで、Skymontは4つ搭載しているため、「可能な限り並列化し、ポートの接続を統一し、ALUの数を統一する」という開発方針に沿った設計ができている。
これにより、理論的なピーク性能は、これらのワークロードにおいて、前世代の2倍になっている。さらに、FADD、FMUL、FMAのレイテンシを削減している。FMAのレイテンシは4サイクルまで短縮されていて、これは最新のマイクロアーキテクチャとほぼ同等だ。Skymontでは、帯域幅を増加し、同時にレイテンシが短縮している。
ハードウェアレベルでの数値の丸め処理のサポートと浮動小数点の正規化も強化された。以前のGracemontやCrestmontでは、これらのハードウェア機能を省いていたため、C言語でプログラムをコンパイルする際に、最適化オプションとして「-O2」を指定しても、厳密なIEEE規格に従うバイナリが生成されていた。
これは、コンパイラではプログラムが厳密なIEEE規格を必要かどうかを判断できないため、デフォルトで厳密な規格に従うからだ。この結果、浮動小数点で正確に表現できない数値が発生した場合、IEEE規格に従った丸め処理が行なれ、場合によっては計算結果が意図しないものになる可能性があったという。
DAZ(Denormals Are Zero)やFTZ(Flush To Zero)といったx86のフラグは、予測可能な結果を与えるが、必ずしもすべての規則に従うわけではない。そのため、GCC-O2コンパイルのようにこれらのフラグを使用しない場合、マイクロコードに処理を委ねて修正する必要があった。Skymontでは、この処理をハードウェアで直接行なうことで、より信頼性の高い性能を実現している。ユーザーには気づきにくいかもしれないが、細かな部分を改善し、信頼性の高い性能を提供している。
もう1つのポイントはAIだ。Skymontでは、VNNI命令を実行するSIMUL実行ユニットを2つ増やした。GracemontではSIMULが1つ、Crestmontでは2つだったが、Skymontでは4つになり、この2世代でVNNI命令を実行できるハードウェアの量を4倍にしている。また、FP32やFP64の処理能力も2倍になっている。ベクトルハードウェアを追加することは重要なのだが、マシン全体のバランスも考慮する必要がある。