後藤弘茂のWeekly海外ニュース
シングルスレッド処理向上で最上級の性能を得たArm「Cortex-A77」のマイクロアーキテクチャ
2019年6月4日 11:00
2020年のハイエンドCPUコア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コアには手を出さないように見えた。
だが、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-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命令アーキテクチャと比べればずっと軽いが、それでも命令デコードは電力を食うことに変わりはない。そのため、命令デコーダの数自体は絞ったほうが、電力や効率面では有利となる。
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命令/クロックのままだ。命令帯域が増えたことを強調する意図があると見られるが、わかりにくい。
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階層になった。
レジスタリネーミング/ディスパッチ/コミットエンジンでは、ディスパッチされる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とストアパイプの命令ポートが分離された。理論上はアドレス生成とストアデータハンドルが並列に行なわれるため効率的だが、ロード/ストアの場合は、インフライトで制御できるロード/ストア数やロード/ストア帯域、プリフェッチのほうが重要となる。