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

AMDの次世代CPU「ZEN」の整数ユニットはBulldozer系と全く異なる

AMD ZENの整数コアアーキテクチャ

 AMDは次世代CPUコア「ZEN」で、サーバーとハイエンドデスクトップPC市場への再浸透を狙っている。AMDは、これらの市場でかつてはIntelと互角かそれ以上に戦っていた。しかし、現在ではIntelに押しやられ、存在感を失っている。ZENの最初のターゲットは、この市場に再び浸透することだ。

 知られているように、AMDは今年の第1四半期中にリリースする8コアの「Summit Ridge」で、パフォーマンスデスクトップ市場を狙う。新ブランド「Ryzen」として投入する予定だ。Summit Ridgeは8CPUコアで、SMT(Simultaneous Multithreading)によって16スレッドを並列実行が可能。動作周波数は3.4GHz以上だ。

デスクトップ向けの「Summit Ridge」、サーバー向けの「Naples」、ノートPC向けの「Raven Ridge」

 続けて、AMDは第2四半期にはサーバー向けの「Naples」を投入する。Naplesは、32コア/64スレッドのハイエンドサーバーCPUとなる。Naplesでは、新ファブリックによって4個のダイを結合させると見られる。

 ハイエンドサーバー市場では、依然としてシングルスレッド性能が重視されている。AMDは、ZENでその市場を戦えると確信を持っているように見える。理由は明白で、ZENではアーキテクチャ的に、スレッド当たりの絶対性能と電力効率に優れるからだ。既にレポートしたように、ZENでは分岐予測と命令デコードと、デコード済みの内部命令のキャッシングなどを大きく改良した。加えて、実行パイプも前世代のBulldozer/Steamroller系とはアーキテクチャを大きく変えている。

 ZENとBulldozerで大きく異なるのは、整数パイプだ。Bulldozer系アーキテクチャでは、整数パイプはスレッド毎に分割されていた。CPUモジュールの中に整数コアが2つあり、並列にスレッドを実行できるようになっていた。そのため、Bulldozerでは個々の整数ユニットは狭く、2個の整数演算ユニットと2個のアドレス生成ユニットで構成されていた。言ってみれば、2並列の整数演算性能を持つ、小さなCPUコアを2個統合したのがBulldozerだった。

AMDのCPUマイクロアーキテクチャの流れ

 Bulldozerの利点は、2スレッドを整数系リソースの競合なく円滑に並列実行できる点だ。弱点は、シングルスレッドの性能が相対的に低くなる点で、AMDは、CPUに求められる要素が、シングルスレッドの絶対性能ではなく、マルチスレッドの電力あたりの性能になると予測して、このアーキテクチャを取った。しかし、読みは外れて、Bulldozer系CPUはスレッドあたりの性能が低いという評価を受け、ハイエンドでは以前ほど成功できなかった。

 そこでAMDは、ZENでは、CPUマイクロアーキテクチャをよりトラディショナルな方向に再転換。スレッド毎に物理的に演算ユニットなどのリソースを分割するのではなく、ほとんどのリソースをスレッドで共有する、SMT (Simultaneous Multithreading)方式へとマルチスレッドアーキテクチャを切り替えた。1スレッドだけを走らせるなら、CPUのリソースのほとんどをフルに使うことができる。IntelのHyper-Threadingと基本的には同じ方向だ。

SMT (Simultaneous Multithreading)方式を取るZENのマルチスレッディング

 ZENの整数コアは、整数演算が4パイプ、ロード/ストアのためのアドレス生成が2パイプ。Bulldozer世代と比較すると、スレッドあたりのピークの整数演算並列度は2倍になった。その前のK10世代は整数演算が3パイプだったので、33%アップとなる。ZENが前世代と比較して、クロックあたりの命令並列度であるIPC(Instruction-per-Clock)が大きく伸びた理由の1つは、スレッドあたりの実行パイプの拡張にある。

ZENでは、クロックあたりの性能が大きく伸びる
ZENマイクロアーキテクチャのポイント
AMDのZENマイクロアーキテクチャの全体像

アウトオブオーダ発行は6マイクロOP、リタイヤは8マイクロOP

 ZENでは、ディスパッチユニットから、最大6個のマイクロOPを1サイクルに発行できる。整数コアに対しては最大6マイクロOP/サイクルが可能だ。つまり、インオーダ部からアウトオブオーダ部へと、毎サイクル、最大6マイクロOPずつ送り込むことができる。インフライトで制御できるマイクロOPの数は192。Bulldozerの128エントリよりも大きい。リタイヤキューからは、8マイクロOP/サイクルでリタイヤが可能となっている。

 アウトオブオーダへのディスパッチが6マイクロOPなのに、リタイヤが8マイクロOPであるのは、キューからできる限り速くマイクロOPをリタイヤさせるためだ。「リタイヤの幅を広げておかないと、リタイヤで待つマイクロOPが出てくる。マシンから、より多くのトークンをできるだけ素早くフリーにすれば、その分より多くのマイクロOPをディスパッチできる」と、ZENアーキテクトのMike Clark氏(Senior Fellow, AMD)は説明する。

 AMDは伝統的にコプロセッサアプローチを取っている。ZENも、スケジューラレベルで整数コアと浮動小数点/SIMDコアに分割されている。ディスパッチユニットからは、整数演算やロード/ストアは整数コアへ、浮動小数点/SIMD演算はFPコアへとマイクロOPが発行される。

ZENの整数演算ユニット部

 整数系の物理レジスタファイルは168エントリ。Bulldozerでは、1スレッドあたり96レジスタだった。Bulldozerは2コア合計では192レジスタとなるが、分離されているのに対し、ZENでは1スレッドで168レジスタを割り当てることもできる。

 整数系のスケジューラは、6つの命令ポートそれぞれに14段のキューで合計84エントリ。Bulldozerでは各スレッド毎に40エントリで、2つの整数コア合計では80エントリだった。1ポートあたり10エントリのスケジューラキューだ。ZENの方がスケジューリングのデプスもやや深い。

ZENマイクロアーキテクチャ

 ZENの4つの整数演算ユニットは、通常の演算については同等機能を持つ。ただし、乗算(掛け算: Multiply)、除算(割り算: Divide)、CRC32(巡回冗長検査)の3つの機能は1ユニットずつで、それぞれ別の整数パイプに割り当てられている。

 「1個のALUだけが乗算が可能で、別な1個のALUが除算、別な1個のALUがCRC32を実行可能だ。また、2個のALUでブランチが実行可能だ。しかし、それ以外の算術演算やシフトについては、4個のALUは完全に同一だ」とZENアーキテクトのMike Clark氏(Senior Fellow, AMD)は説明する。

 言い換えれば、乗算と除算、CRC32についてはそれぞれ1ユニットしかないため、1サイクル1命令のスループットだ。しかし、これはCPUの一般的な構成だ。

Intelと異なる2ブランチユニットの主目的

 ZENの整数パイプ群は2つのブランチ(分岐)ユニットを備える。そのため、1サイクルに2つのブランチ命令を実行可能だ。

 「2つのALUパイプが、それぞれ個別のブランチユニットと接続している。2つの分岐は、同じスレッドに属するブランチ命令でも、異なるスレッドに属するブランチ命令でも、どちらでも実行可能だ。2ブランチ/サイクルマシンだ」(Mike Clark氏, Senior Fellow, AMD)

 2並列のブランチユニットは、2スレッドを走らせた場合に、それぞれのスレッドのブランチ命令を同時に実行できる。また、1スレッドの中の複数のブランチ命令も、1サイクルで実行できる。より多くのブランチを1サイクルで処理できるため、ブランチが短いサイクルで連続するコードの実行効率が上がる。

 Haswell以降のIntelアーキテクチャも、2ブランチユニットを持つ。しかし、ZENの2ブランチとは多少目的が異なっている。Intelアーキテクチャでは、整数パイプと浮動小数点/SIMD演算パイプが、同じ命令発行ポートに割り当てられている。Sandy Bridge/Ivy Bridgeまでは、ブランチはポート0のみで、整数演算やFP/SIMD 乗算とポートを共有していた。整数演算の大半は他のポートに逃がすことができるが、FP/SIMD乗算はできない。そのため、Haswell以前は、FP/SIMD乗算とブランチが連続するループでは、命令発行ポートの競合が発生してしまっていた。

 そこでIntelは、Haswellで新たにポート6を新設して、ブランチをもう1ユニット設けた。ポートの競合がないブランチユニットを設けることで、問題を解決できるようにした。もちろん、Intelにも2ブランチユニットは、2ブランチを1サイクルで実行できるという利点があるが、それよりも、複雑な命令発行ポートによるポートの競合を避けるための2つ目のブランチユニット、という意味合いが大きい。

複雑な命令ポートアーキテクチャのIntel

命令ポートの競合を避けるためではないZENの2ブランチユニット

 それに対してZENマイクロアーキテクチャは、Intelのような命令発行ポートの競合の問題が少ない。そのため、2ブランチ/サイクルは、Intelとは意味が異なって来る。ZENでは、純粋にブランチヘビーなコードの効率を上げるという目的となる。

 ちなみに、Haswell系マイクロアーキテクチャでは、ポート0のブランチユニットは、分岐予測が「分岐せず(not taken)」のブランチ命令のみ実行できる仕様だ。ポート0では「分岐(taken)」の予測のブランチ命令は実行できない。分岐(taken)と分岐せず(not taken)の両方が実行できるのは、ポート6の方だけとなっており、2ブランチユニットで並列実行できるブランチ命令に、予測上の制約がある。ZENマイクロアーキテクチャに類似の制約があるかどうかは、まだ分からない。

 1サイクルに2個以上のブランチを実行できるアーキテクチャは、以前から存在する。例えば、ItaniumのIA-64アーキテクチャでは、3-wayのブランチが1サイクルに可能だった。しかしこれは、IA-64が複数のベーシックブロック(分岐命令間の命令ブロック)をコンバインするために、ブロックの最後に複数のブランチをまとめて実行する必要があるという特殊な事情があった。

 ZENは、テスト/コンペア命令とジャンプ命令を融合させる「ブランチフュージョン(Branch Fusion)」を実装している。2つの命令は、ディスパッチステージで1個のマイクロOPに融合される。融合されたブランチフュージョンマイクロOPは、1個のマイクロOPとしてリタイヤまで扱われる。実行時にも2個のマイクロOPには分離されない。言い換えれば、実行パイプ自体がブランチフュージョンに対応したユニットとなっている。