後藤弘茂のWeekly海外ニュース
処理能力が2倍に拡張されたAMD Zen 2のAVXユニット
2019年6月27日 12:11
SIMDユニットだけでなくレジスタとデータポートも2倍に
Zen 2の演算エンジンでもっとも強化されたのはAVX系命令を実行する「浮動小数点(Floating Point)/SIMD(Single Instruction, Multiple Data)」パイプ群だ。Zen 2では、SIMDパイプはZenまでの128-bit幅から256-bit幅へと拡張された。32-bitの単精度浮動小数点演算(FP32)なら8個のエレメントを同時に1サイクルで処理できる。Zen 2では、積和算(Fused Multiply Add:FMAまたはFMAD)が可能なSIMDユニットを2個備えているため、積和算なら1サイクルに32オペレーション分の処理が可能だ。
AMDは、AVX2の256-bit命令をZenでもサポートしていたが、SIMD演算ユニット自体は128-bit幅に留めていた。そのため、Zen 2では、256-bitのAVX-256命令を使う場合は、浮動小数点演算のスループットは2倍になった。ただし、512-bit幅SIMDのAVX-512はZen 2ではサポートされない。AVX-512は単にSIMD幅を2倍にしただけでなく、さまざまな拡張が加わっているからだ。
Zen 2ではFP/SIMDパイプを256-bit幅にしたことに合わせて、物理レジスタファイルも従来の128-bit×160本から、256-bit×160本へと倍増させた。レジスタ容量は2.5KB分から5KB分へと増えたことになる。
さらに、FP/SIMDパイプの拡張に合わせて、L1データキャッシュとFPユニットのパスも、2個の256-bitロードと1個の256-bitストアを並列に可能に拡張した。従来のZenでは、2個の128-bitロードと1個の128-bitストアを並列に行なう仕様だった。ロード/ストアの帯域は2倍になったことになる。
整数コア側では、ロード/ストアのためのアドレス生成(Address Generation)も3パイプで並列になった。FP/SIMDの256-bitへの倍拡張に合わせてレジスタやポートも拡張された。
ただし、Zen 2でもFP/SIMDユニットの演算パイプは従来どおり4で、毎サイクル最大4個のMicro-OPsのディスパッチである点は変わっていない。たとえば、256-bitになったパイプに、各2個ずつ128-bitの演算Micro-OPsを発行することはできない。
命令スケジューラのキューは、Zenの96から、Zen 2では100へと小幅に拡張された。ちなみに、初代Bulldozerは128-bitのFMADパイプは2本だった。Bulldozerでは2つの整数コアで1個のFP/SIMDユニットを共有していたが、Zen/Zen 2ではSMT(Simultaneous Multithreading)時には2スレッドが1個のFP/SIMDを共有する。
パイプによって機能が異なるZen系アーキテクチャのSIMDユニット
Zen/Zen 2アーキテクチャのFP/SIMDの4パイプは、浮動小数点(FP)の積和算(Fused Multiply Add:FMAまたはFMAD)と積算(Multiply:MUL)のパイプが2本、FPの加算(Addition:ADD)のパイプが2本の構成だ。浮動小数点演算なのでFMAD、FMUL、FMADとなる。FMADとFMULのパイプにはMULという名称がつけられているが、実際にはFMADユニットも実装されている。これは、Zen 2でも変わらない。
ちなみに、Zenのソフトウェア最適化ガイドではパイプがナンバリングされている。1つ目のMULがパイプ0、2つ目のMULがパイプ1、1つ目のADDがパイプ2、2つ目のADDがパイプ3。つまり、パイプ0とパイプ1がMUL、パイプ2とパイプ3がADDだ。
初代Zenでは、各パイプがサポートするファンクションが異なっており、パイプナンバーに識別できる。たとえば、パイプ0は浮動小数点(FP)の積和算(FMA)と積算(MUL)と整数のMULと加算(ADD)。パイプ1はFP FMAとMULと整数ADDは備えるが、整数MULを持たず、代わりにSIMDのシャッフルユニットを備える。
AMDによると、ソフトウェアの最適化を容易にするために、4本のパイプに機能を分散しており、Zen 2でも各パイプは非対称だという。下がZenのFP/SIMDパイプのユニット構成図だ。
3オペランドのFMADのサポート方式
Zen系マイクロアーキテクチャでは、MULとADDを組み合わせるFMADも従来どおりサポートする(ただし3オペランドフォーマットのFMA3のみ)。Zenでは、FMADは、FMULパイプとFMADパイプを連結させて使うわけではない。FMADユニット自体はFMULパイプに実装されている。しかし、ZenではFMADオペレーションの場合は、FMADのパイプの片方のパイプ3は使うことができない。それは、レジスタからの読み出しポートを、2本のFMADパイプが使ってしまうからだ。
FMADでは演算は3オペランドとなる。「a * b + c」で3つのソースオペランドをレジスタから読み出す。しかし、AMDのFP/SIMDパイプは通常の演算で必要となる2ソース読み出し分のレジスタリードポートしか備えていない。そこで、FMAD実行時は、レジスタからの読み出しパスをADDパイプから借用する。
具体的にはパイプ3の2本のレジスタリードパスを、パイプ0とパイプ1のFMADにそれぞれ1本ずつ接続される。その結果パイプ0とパイプ1のFMADは3レジスタリードが可能となり、3オペランド演算が可能になる。
この構成は基本的にZen 2でも変わらないと見られる。それは、Zen 2のほうが、Zenよりさらにレジスタポートが高級になっているからだ。現在のベクタ幅の広いSIMD演算ユニットでは、演算ユニットそのものだけでなく、配線が実装上非常に複雑だ。256-bit SIMDユニットなら、256-bit幅のレジスタリードポートが2つ、同じく256-bit幅のレジスタライトポートが1つ必要になる。4個のSIMD演算ユニットがあれば、4倍のポートが必要で、それをコンフリクトフリーで実装する必要がある。
Zenが、こうしたレジスタポートの使い回し的な実装をしているのは、物理的なレジスタポート数を減らすためだ。ちなみに、IntelのSunny Coveコアも、まったく異なるものの、やはりレジスタポートをセーブしたSIMDユニット群の設計を採っている可能性が高い。
ちなみに、AMDはBulldozerでは4オペランドのFMAD命令をサポートしていた。しかし、Zen以降は3オペランドのFMADのみサポートされている。
Zen 2では、256-bitへとSIMDユニットが拡張されただけでなく、ユニット自体のパフォーマンスも上がった。Zenでは4サイクルだった乗算(MUL)のレイテンシがZen 2では3サイクルとなった。
256-bit化によって内部命令を減らして制御を容易に
AMDは、Zenまで、AVX2の256-bit命令をサポートしていたが、演算ユニット自体は128-bit幅に留めていた。256-bitのAVX2命令は、2つのSIMDパイプを同期させて実行するのではなく、内部命令レベルで2個の命令に分割して実行していた。
たとえば、Zenでは、256-bit幅のAVX2命令は、フロントエンドでは1個の256-bit Instructionに変換される。しかし、ディスパッチされる段階で、256-bit Instructionは2個の128-bit 演算Micro-OPに変換され実行パスに送られる。
ちなみに、Bulldozer系の場合は、256-bit幅のAVX2命令は、フロントエンドで2個のMacroOPに変換(Fast-Path Double)されていた。
Zen 2では、内部が256-bit化されたことで、スループットが2倍になっただけでなく、スケジューリングリソースもセーブされ、より命令実行が効率的になり、省電力となり性能を引き上げる余地も増えたという。ZenのアーキテクトMike Clark氏(Corporate Fellow & Zen Architect, AMD)は次のように語る
「(AVX2 256-bit命令については)Zen 2とZenのどちらも、(x86/x64命令から)デコードしたあとは1個のInstructionだ。しかし、Zenではディスパッチのさいに2つの(128-bit)Micro-OPsになる。そのため、4つしかないディスパッチポートのうち2つを(1個のAVX2 256-bit命令で)使ってしまう。また、スケジューラにも2つのエントリが必要で、レジスタ読み出しも2セットの(128-bit)レジスタの読み出しとしなければならない。
加えてロードオペレーションがある。Zenでは、(1個のAVX2 256命令から)2個の(128-bit)ロード/ストアMicro-OPsをロードキューに入れる必要がある。そして、それらのすべてをリタイヤキューまでトラックする必要がある。
ところが、Zen 2ではそれぞれ1個(の256-bit Micro-OP)で済むようになる。これは、省電力と性能の面では、非常に有効だ。1個のリタイヤキューのエントリで、1個のスケジューラエントリ、1個のロードまたはストア、非常にすっきりした(笑)」。
ストア専用のアドレス生成ユニットが加わる
Zen 2では、ロード/ストアユニットが2パイプから3パイプへと拡張された。従来は、アドレス生成ユニット(Address Generation Unit:AGU)が2個の構成だったが、新たなAGUが割り当てられた。従来からの2個のAGUはロードとストア両用、3個目のAGUはストア専用だ。この拡張に合わせて、ストアキューが従来の44エントリから48エントリへと増やされた。
Zenアーキテクチャでは、従来から2ロードと1ストアの3オペレーション/サイクルのロード/ストアスループットを備えていた。しかし、従来のAGUパイプは2本で、ピークのロード/ストアサイクルにマッチしていなかった。Zen 2アーキテクチャで、AGUパイプとロード/ストアオペレーションがマッチすることになる。
ちなみに、2個のロード/ストアAGUと1個のストアAGUの構成は、IntelのSkylakeと同じだ。Intelは、10nmのSunny Coveではロード/ストアのAGUをさらに4個に増やしている。Sunny Coveでは、インフライトでハンドルできるストア数は72だ。
ロード/ストアでは、このほかにも細かな改良が加えられている。メモリに格納するデータをコンバインする「WCB (Write Combine Buffer)」は、複数サイクルに分散するメモリライトを1つにまとめることで、省電力化と高性能化を実現する。AMDのWCBには、従来、複数の書き込みストリームへの対応に問題があった。
Zen 2では、複数の書き込みストリームを、よりよくハンドルできるようにしたという。また、データのL2キャッシュからL1キャッシュへのプリフェッチもアルゴリズムが改良された。ちなみに、AMDアーキテクチャではL3からのプリフェッチは行なわない。
L1データキャッシュの容量は32KBで従来のZenと同様。Translation Lookaside Buffer (TLB)は、L1 DTLBが64エントリと変わらず。L2 TLBは従来と同様命令とデータに分かれており、L2 DTLBは1.5Kエントリだったのが2Kになった。L2 DTLBはレイテンシが短縮されたほか、1Gページのサポートも加わった。
CPUの設計思想を変えたAMD
Zen 2のFP/SIMDパイプラインの強化は、AMDのCPU設計思想の変化を明確に物語っている。それは、「FP/SIMD演算はGPUコアにまかせる」という発想から「CPUでもそれなりに高いFP/SIMD性能を」という路線への変更だ。AVX-512を実装するIntelほどCPUのFP/SIMDの強化は進めないが、明らかにCPU単体でのFP/SIMD性能も重視している。
以前のAMDは、CPUコアとGPUコアを融合させたAPU(Accelerated Processing Unit)にフォーカスしていた。一時は、サーバー向けにも大型APUを開発して投入する計画を持っていた。そのため、SIMD演算はどちらかというと、APUに内蔵したGPUコアにまかせるという傾向が強かった。
APUに内蔵したGPUコアで、CPUコアとメモリコヒーレンシを取り、粒度の小さな並列タスクもGPUコアに振って行く、というのがAMDの思想だった。そのため、AMDは、CPUコア側のFP/SIMDユニットはひかえめの実装に留める方向に見えた。Intelが256-bit SIMDユニットに移行したあとも、AMDは128-bit SIMDに抑えていた。
だが、AMDは、Zen世代からディスクリートCPU重視路線へと戻った。もちろん、APUもメインストリームに積極的に推進する。しかし、高性能分野も、ディスクリートCPUとディスクリートGPUというマッチングで、積極的にカバーするというのがAMDの現在の思想だ。
ここで、高性能のディスクリートCPUとディスクリートGPUの両方を持っているというAMDの強味を活かすことができるというのが、AMDの現在の戦略の根幹だと思われる。