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

シングルスレッド処理向上で最上級の性能を得たArm「Cortex-A77」のマイクロアーキテクチャ

2020年のハイエンドCPUコアCortex-A77

Armの高性能CPUコア路線の第2段がCortex-A77

 Armは台湾で先週開催されたCOMPUTEX TAIPEI 2019で、2020年のスマートフォンのCPUとなる「Cortex-A77」を発表した。Cortex-A77は、シングルスレッド性能を引き上げた、パフォーマンスクラスのCPUコアだ。Arm自身のCPUコアが、トップレベルのArm CPUコア群の仲間入りをする。

 かつて、Arm命令セットアーキテクチャのCPUコアは、メインストリームから下がArmのCortex-A系CPUコア、パフォーマンスクラスはQualcommやAppleやSamsungなどが独自に開発したArm CPUコアという棲み分けになっていた。Armからアーキテクチャルライセンスを受けたメーカーは、Arm自身よりも高性能なCPUコアを創って市場を棲み分けていた。Armは、自社命令セットアーキテクチャの普及のために、あえて高性能CPUコアには手を出さないように見えた。

Cortex-A76をベースに拡張
Cortex-A76と同程度の周波数で、高い電力効率を維持しながら性能を上げることがCortex-A77の設計ゴール

 だが、Armは、昨年(2018年)のCortex-A76からその戦略を変えた。Cortex-A76は、パフォーマンスクラスのArmコアで、アーキテクチャが一新された。Cortex-A76では、Cortex-A75から大幅に性能が引き上げられた。Cortex-A77は、その路線を継承し、Cortex-A76に欠けていた部分を補い、さらに性能を引き上げた。Cortex-A77は、7nm~6nm世代のプロセスが成熟した時期の、Armの標準的なパフォーマンスコアとなるだろう。

 また、この戦略変更は、サーバー向けのCPUブランド「Neoverse(ネオヴァース)」の投入とも連携している。Armは、サーバールームにArmアーキテクチャを浸透させるとしながら、昨年までは、Arm自身ではサーバー向けにふさわしい高性能CPUコアを開発して来なかった。サーバー向けCPUコアはサードパーティにまかせるのが、Armの戦略だった。

 だが、現在では路線を変更して、サーバー向けフィーチャを備えたCPUコア群をNeoverseの名前で導入している。そして、最初の高性能サーバーCPU「NeoverseN1」は、Cortex-A76をベースとしている。Cortex-A77も、フィーチャを拡張してNeoverse系として投入されることは間違いない。

シングルスレッド性能の向上にフォーカス

 Cortex-A77では、ArmのCPUコアの弱点だったシングルスレッド性能を大幅に伸ばした。昨年発表したCortex-A76に対して、IPC(Instruction-per-Clock)で20%以上も拡張されたという。同じ7nmプロセスで、同じ動作周波数時で、シングルスレッド性能は20%アップになるとArmは説明する。それも、わずか17%のダイエリア増だけでだ。そもそも、Cortex-A76自体が、それまでのCortex-A75に対して、35%のシングルスレッド性能アップだった。2年でArmのCPU IPの最高性能は劇的に向上したことになる。

Cortex-A76と比較すると同じプロセス同じ動作周波数でシングルスレッド性能が20%向上
Cortex-A76に対するCortex-A77の性能向上

 プロセッサメーカーのこうした性能比較には、マーケティングメッセージが強いものがあるが、Cortex-A77の性能にはアーキテクチャ上の裏付けがある。実際に、シングルスレッド性能を引き上げるアーキテクチャ上の工夫が仕込まれている。電力を犠牲にして性能を上げたCPUコアではなく、コアの面積と電力は抑えながら効率よく性能を引き上げている。

 Cortex-A77マイクロアーキテクチャの最大の特徴は、インストラクション帯域が6マクロオペレーション(MOPs)/サイクルに拡張されたことだ。ArmはCortex-A15からCortex-A75まで、7年の間、最高性能のCPUのインストラクションデコード帯域を3命令/サイクルに留めてきた。Cortex-A76では、それを4命令デコード/サイクルに拡張、命令並列性を大幅に高めた。

 Cortex-A77では、それをさらに拡張して、フロントエンドからの命令帯域を、6MOPs/サイクルへと50%増やした。つまり、Arm CPUの命令帯域は、1年ごとに3命令/サイクル→4命令/サイクル→6命令/サイクル相当へと急激に増えた。より多くの命令を命令スケジューラに送り込むことができれば、命令並列実行のチャンスがより増える。その結果として、クロック当たりの性能であるIPCが上がることになる。

 しかし、命令帯域を増やすことは、消費電力増の危険もはらんでいる。命令デコーダが電力を消費する上に、命令フェッチの粒度を高めると、分岐予測ミス時のムダも大きくなってしまうからだ。そこで、Armは内部命令をキャッシュするマクロOPキャッシュを導入した。

64-bitの内部表現に変換するCortex-A77アーキテクチャ

 Cortex-A77も、命令デコード帯域自体は、Cortex-A76と同様に4命令/サイクルだ。しかし、デコーダによって変換された内部命令は、専用のL0命令キャッシュに格納される。そして、L0命令キャッシュからの命令発行の帯域は、6命令/サイクルとなっている。つまり、キャッシュにヒットする場合は、6命令/サイクルになるアーキテクチャだ。

 Armの命令系統であっても、命令デコードはロジック規模が比較的大きく相対的に電力消費も大きい。もちろん、可変長かつ多種のプリフィックスを持つx86命令アーキテクチャと比べればずっと軽いが、それでも命令デコードは電力を食うことに変わりはない。そのため、命令デコーダの数自体は絞ったほうが、電力や効率面では有利となる。

Cortex-A77のマイクロアーキテクチャの概観
リッチになったCortex-A77のマイクロアーキテクチャ
PDF版はこちら

 Armの現在のパフォーマンスCPUマイクロアーキテクチャでは、ArmのCPU命令は単純な内部命令「マイクロオペレーション(uOP:Micro-Operation)」に変換されて実行される。命令スケジューラからはuOPが実行エンジンに発行される。しかし、命令デコーダからは、一部のuOPが融合(Fused)したオペレーションのかたちでデコードされる。このフューズドuOPは「Macro-OP(マクロOP)」と呼ばれる場合もある。Cortex-A77に実装されているのは、このMOPをキャッシュするL0命令キャッシュで「MOP Cache(MOPキャッシュ)」と呼ばれる。

 ちなみに、現在のアーキテクチャでは、Armの32-bit系の命令「A32」、「T32」も、内部表現的には64-bitに変換される。つまり、すべてが「A64」相当の64-bit系の内部命令表現になる。これは、Cortex-A76/77世代のCPUでは、すでにソフトウェア側は64-bitが主流になっていると判断。ハードウェアをシンプルにするために64-bit変換することにしたと見られる。Intelもかつて16-bitを32-bitの内部命令に変換する似たアプローチを取ったことがある。

 ちょっと混乱を招くのが、このMOPキャッシュアーキテクチャを説明するArmのスライドだ。下のように、ややトリッキーなフロントエンドのブロック図となっている。

 まず、本来ならデコーダの下流に描くべきMOPキャッシュがフロントエンドに含まれている。そして、MOPキャッシュを含むフロントエンドからデコーダパイプラインへ6インストラクション/クロックで命令がディスパッチされると描かれている。これはもちろん、MOPキャッシュから読み出した場合で、L1命令キャッシュから命令デコーダは4命令/クロックのままだ。命令帯域が増えたことを強調する意図があると見られるが、わかりにくい。

新たに、内部命令をキャッシュするL0命令キャッシュにあたるマクロOPsキャッシュが加わった
命令デコード/レジスタンスリネーム/コミットのユニットでは、デコードしたMOPsのディスパッチ帯域が6MOPs/Cycleになった

MOPキャッシュによる命令帯域の拡張は他社も

 Cortex-A77では、このようにMOPキャッシュを使うことで、6 MOPs/サイクルの命令帯域を、デコーダを肥大化させることなく実現している。ちなみに、この手法はArmの独創ではなく、すでにIntelやAMDも実装している。

 IntelはSkylake系アーキテクチャでは命令デコーダは5-wayだがuOPキャッシュから最大6 uOPs/サイクルで命令読み出しできる、AMDはZENアーキテクチャでは命令デコーダは4-wayだがOPキャッシュから最大8 MOPs/サイクルで命令読み出しできる。内部命令キャッシュを使うことで、命令帯域を増やすことは、現在のCPUアーキテクチャでは常套的な手段だ。

 Armによると、L0のMOPキャッシュは85%以上のヒット率になるため、多くのワークロードで性能向上があるという。Cortex-A76の設計段階から、次にL0 MOPキャッシュを組み込むことは予定されていたようで、Cortex-A76のTechnical Reference ManualにL0 Macro-OPキャッシュのイベント定義がすでに組み込まれている。

 Cortex-A77では、MOPキャッシュの導入で命令帯域を強化したことで、付帯的にほかの部分も強化された。まず、フロントエンドでは分岐予測の読み出しサイクルが64-byte/サイクルと、より先の分岐まで予測するようになった。これは、MOPキャッシュも分岐予測ユニットと連携するからで、6 MOP/サイクルの読み出しに合わせた拡張だ。分岐予測ユニット自体も強化され、BTB(Branch Target Buffer)はCortex-A76の6Kから8Kエントリと拡張された。また、3階層だったBTBは、2階層になった。

フロントエンドでは分岐予測ウィンドウが64-byte/Cycleとなった。また、BTB(Branch Target Buffer)も8Kエントリと拡張され2階層にシンプル化された

 レジスタリネーミング/ディスパッチ/コミットエンジンでは、ディスパッチされるuOPが最大で10 uOP/サイクルになった。Cortex-A76では8 uOP/サイクルだった。また、インフライトで制御できる命令ウィンドウが128エントリから160エントリへと拡張された。より多くのMOPがフィートされるようになったため、より多くのMOPをハンドルできるように拡張された。ただし、IntelのSunny Coveでは352エントリのリオーダバッファとなっており、x86と比べるとまだ小さい。

実行パイプではALUが4個と分岐が2個の構成に

 実行ユニットでは、ALUと分岐ユニットが1個ずつ追加された。分岐ユニットは合計2ユニットで、それぞれ専用のイシューポートを持つ。2分岐/サイクルが可能なマシンとなった。ALUは単純命令のALUが追加され、ALUの構成は複雑ALUが1に、単純ALUが2の構成となった。また、ALUと命令ポートを共有するAESエンクリプションエンジンも2つになった。

実行ユニットでは分岐ユニットと整数演算ユニットが加えられた

 ロード/ストアユニットでは、Cortex-A76でストアデータパイプが導入された。しかし、Cortex-A76ではAGU(アドレス生成ユニット:Address Generator Unit)とストアパイプは同じ命令発行ポートを共有されていた。

 Cortex-A77では、Intel式に、AGUとストアパイプの命令ポートが分離された。理論上はアドレス生成とストアデータハンドルが並列に行なわれるため効率的だが、ロード/ストアの場合は、インフライトで制御できるロード/ストア数やロード/ストア帯域、プリフェッチのほうが重要となる。

ロード/ストアパイプでは、ストアデータが専用の命令発行ポートに割り当てられた
ロードではプリフェッチングがインテリジェント化された
Arm自社設計のCPUコアでトップクラスの性能を実現