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

Intelの10nm世代CPUコア「Sunny Cove」のカギとなるAVX-512

 Intelの10nmプロセス世代のCore系CPUコア「Sunny Cove」は、CPUのマイクロアーキテクチャの比較的大きな変更だ。

 現在、概要が明らかになっているのは、実行パイプ/メモリ側だが、そちらだけでも大きな変更がわかる。現在推測されるSunny Coveの全体像を、現在のSkylake系アーキテクチャと比較すると下のようになる。

Sunny Coveの推定されるブロック図
PDF版はこちら
Skylakeのブロック図
PDF版はこちら

10nm世代のパフォーマンスCPUコアSunny Cove

 Skylakeでは、AVX-512はオプショナルで、本来サーバー向けとして開発されたSkylake-Xにしか実装されてない。しかし、Sunny Coveでは、AVX-512は標準で実装されていると見られる。

 AVX-512は、従来のAVXのSIMD(Single Instruction, Multiple Data)を2倍に伸ばしただけのユニットではない。ベクタユニットとして見た場合、大きな変革となっており、GPU的な性格を持っている。

 AVX-512は、もともとGPUへの対抗として開発された「Larrabee」の命令拡張「Larrabee NI(Larrabee New Instructions)」から発展した。LarrabeeからXeon Phiを経て、命令フォーマットは変わったものの、基本的な特徴はLNIを受け継いでいる。

 512-bitのワイドなSIMDユニットで、32-bit単精度浮動小数点演算なら16-wideの実行ができる。それだけでなく、プレディケーションの本格的なサポートなどの新要素があり、従来のAVXからは大きく変わっている。Sunny CoveのAVX-512の実装は、そうした特徴を活かすものとなっている。

AVX命令の発展

 Sunny CoveのAVX-512の実装は、Skylake-Xの実装を拡張したものと推測される。現在のSkylakeでは、ポート0とポート1、それぞれに256-bit SIMDのFMA(積和算)ユニットを備えている。そしてポート5に、256-bitのシャッフルユニットを持つ。

 Skylake-Xではこれを拡張し、従来のポート0とポート1の256-bit SIMDのFMAユニット2個を束ねて、512-bit幅のSIMDユニットとして使う。加えて、ポート5に新たに512-bitのFMAユニットを配置。ポートを3つ使うことで、512bitのFMAを2並列で実行できるアーキテクチャにしている。

 Sunny CoveのAVX-512実装は、これを拡張したものと見られるが、顕著な違いもある。

Skylake-XでのAVX-512の実装
各CPUアーキテクチャ世代のAVX命令の実装

512bitとワイドなレジスタへのアクセス

 そもそも、なぜポート0とポート1は、256-bitのFMAユニットのままなのか。これは、従来の256-bit AVX時には、ポート5のFMAユニットをオフにして電力をセーブするためと見られる。

 また、レジスタアクセスポートの有効利用も考慮していると考えられる。ポート0、1、5は、それぞれSIMDレジスタへのアクセスポートを持つが、これが設計上かなりやっかいだからだ。

 Intelは、AVX-512で新たに512-bit長のレジスタ「ZMM」を導入した。論理レジスタは32本で、Sunny Coveでの物理レジスタ数はまだわかっていない。こうした、比較的長いベクタを実装する場合の問題の1つは、レジスタアクセスだ。

 積和算では、1サイクルにレジスタに対して3リードと1ライトが必要となる。AVX-512の場合は、それぞれが512-bit幅となり、しかもユニットが2つある。合計で512-bitのリードパスが6、ライトパスが2となり、配線だけでもやっかいだ。

AVXレジスタ

 問題を解決する方法の1つは、512-bitのレジスタファイルを256-bitずつに分割して実装することだ。512-bitと言っても、32-bit/64-bitのレーンで分かれているので、分割したアクセスが可能だ。

 また、256-bit時には、そもそも半分のサイズしか必要としない。Sunny Coveの想定される実装では、ポート0とポート1の256-bitベクタ演算ユニットが、それぞれ512-bitレジスタを256-bitずつ分割したリージョンにアクセスする。たとえばポート0がアッパー、ポート1がローワーといった具合だ。

 もともと、ポート0とポート1は、それぞれ256-bitのYMMレジスタへのアクセスポートを持っている。そのため、ポート0とポート1をコンバインして512-bitのAVX-512演算パスとする場合は、ポート0と1のどちらかは、従来の256-bitのレジスタアクセスポートのまま利用できる。ZMMレジスタはYMMレジスタの拡張で、物理的な実装は256-bit分を加えたものと見られるからだ。

SkylakeのAVXユニットの配置と、推測されるSunny CoveのAVXユニット配置
PDF版はこちら

ZMMレジスタ全長へのアクセスが必要なシャッフルユニット

 ポート0とポート1の組み合わせのように、積和算などの通常の演算ユニットは、512-bitのレジスタファイルを256-bitずつに分割して使うことができる。

 しかし、同じAVXユニットであっても、シャッフルユニットはそうはいかない。シャッフルユニットは、ベクタレジスタのスロットの内容を入れ替えるために、ZMMレジスタの全スロットにアクセスできなければならないので、512-bit長のレジスタ全体に接続される必要がある。

 そのため、シャッフルユニットはポート5に配置されるのが自然となる。ポート5のベクタ演算ユニットは、512-bit長のユニットで、512-bitのZMMレジスタ全体に対してのアクセスポートを持つからだ。これがSkylake-Xでのシャッフルユニットの実装方式だ。

 ところが、Sunny Coveはシャッフルユニットをポート1にも備えている。この2つ目のシャッフルユニットについては、まだ詳細はわかっていない。

 もしこれが、256-bitのYMM専用のシャッフルユニットなら、本来のポート1のYMMレジスタへのアクセスパスを使うことになる。しかし、より可能性がありそうなのは、2個目の512-bitのシャッフルユニットの場合で、その場合は512-bitのZMMレジスタ全長へのパスが必要となる。

 でも、よく考えるとポート0かポート1のどちらかは、256-bitに分割したZMMレジスタの、ローワーとアッパーの両方へのアクセスを持っているはずだ。なので、ここにシャッフルユニットを配置しても問題がないことになる。その場合は、1サイクルに最大2つのAVX-512シャッフル命令を実行できる実装となる。

 では、なぜ2つもシャッフルユニットが必要になるのか。それは、AVX-512のベクタ長が長く、効率の高いベクタプロセッシングを実現するためには、Structure of Arrays(SOA)型のエレメント配列のプロセッシングが重要となるからだ。SOAのためのワークアイテムのメモリレイアウトの変換のために、シャッフルユニットが重要となると推測される。

SOAレイアウトで効率化するAVX-512

 じつは、このことはAVX-512のもっとも重要なポイントに関わっている。SOAレイアウトの実行は、AVX-512のキモの部分であり、AVX-512が従来のSSE/AVXと本質的に異なる部分だ。

 そして、SOAを効率的に実行できるように、AVX-512からはペナルティのないプレディケーション機能も実装された。これは、GPUと同じようなコントロールフロー制御が可能なベクタユニットになったことを意味する。

 ベクタプロセッシングのメモリレイアウトには、大きく分けて2種類がある。1つは「Array of Structures(AOS)」や「パックド(Packed)」、「SIMD」と呼ばれる方式。もう1つは「Structure of Arrays(SOA)」や「スカラ(Scalar)」、「SIMT(Single Instruction, Multiple Thread)」と呼ばれる方式だ。

 AOS/パックド/SIMD型では、データを一定の粒度でパックされたかたちで処理する。それに対して、SOA/スカラ/SIMT型では、パックを分解して、エレメントを束ねたようなかたちで処理する。

16-wideのベクタユニットでのAOSとSOAそれぞれの実行スタイルの違い
SOAではベクタを見かけ上スカラに変換する

 AOSでは、パックするエレメントストラクチャの粒度があるため、効率が悪くなるケースがある。たとえば、3つのエレメントを4-wayのベクタで実行する場合は、1スロットが無駄になってしまう。

 それに対して、SOAではパックを分解してアレイに流し込むので、無駄が生じない。たとえば、4-wayのベクタなら、3エレメントのパックを4個分、3サイクルで実行できる。ベクタ長を長くすればするほどこの問題は大きくなる。

 そのため、ベクタ長が長い場合はSOAをサポートする。そしてSOAを効率的に処理するために、ベクタの各レーンに対してのコントロールフロー制御の機能を実装するのが一般的だ。

 たとえば、512-bitなら単精度32-bitが16レーンとなるが、16レーンがすべて同じ命令を実行しなければならないとなると、適用できるアプリケーションはかぎられてしまう。

 しかし、ベクタの16レーンそれぞれに、命令を実行するかしないかの制御を行なうことができるなら、アプリケーションの適用は非常に簡単になる。

マスクレジスタンを使ったプレディケーションが現在の潮流

 こうしたベクタのコントロールフローの制御では、マスクレジスタを使ったプレディケーションを行なうのが一般的だ。

 プレディケーションでは、各レーン毎に、命令を実行するかしないか(または演算の結果をレジスタに書き込むか書き込まないか)をマスクレジスタによって選択する。

 専用のマスクレジスタを使うことで、プレディケーションをペナルティなしで実現する。プレディケーションを使えば、ベクタのそれぞれのレーンに条件で分岐が発生しても、あたかも分岐したかのように見せかけることができる。

AVX-512やLNIではマスクレジスタによるコントロールフロー制御が可能
マスクレジスタを使ったベクタプロセッシングのコントロールフロー制御

 ベクタ長をワイドにして、マスクレジスタによるプレディケーションを行ない、SOAをサポートすることは、現在のCPUのベクタユニットの潮流となっている。

 たとえば、ArmのScalable Vector Extention(SVE)や、RISC-VのベクタISAは、ある程度似たようなマスクレジスタによるプレディケーションをサポートしている。NVIDIAやAMD、Imagination TechnologiesなどのGPUも同様だ。

 AVX-512もこの列に並ぶ。正確には、この機能はAVX-512の元になったLarrabee NI(Larrabee New Instructions)から実装されていたので、CPUではIntelが先行していた。それが、Intel CPU全体に浸透しようとしているのが現在だ。

AOSとSOAの間の変換に必要となるシャッフルユニット

 マスクレジスタによって、AVX-512ではSOA型のプロセッシングが効率的になった。しかし、SOAで実行しようとしても、メモリ上の元データの配列がAOSだった場合は、SOAへの変換が必要となる。

 この変換では、ギャザー/スキャッタ命令を使うこともできるが、レイテンシが長くメモリアクセスを複雑にする。そこで、ギャザーを使う代わりに、ロードとシャッフルを組み合わせた方法が登場する。

256-bitでのシャッフルを使ったAOS→SOA変換の例
AVX-512Fで加わった2ソースシャッフル

 このレイアウト変換プロセスでは、シャッフルを複数回行なう。そのため、変換時だけシャッフルが連続することになり、シャッフルエンジンがビジーになる。おそらく、Sunny CoveのAVX-512ユニットの配置は、こうしたニーズに対応するためではないかと推測される。

 つまり、AVX-512Fで拡張されたAOS-SOA変換向けの命令を活かすために、Sunny CoveではAVX-512ユニットも拡張されたと推測される。その結果、AVX-512をより有効に活かすことができると見られる。