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

実行モデルを変更したSkylakeのGPUコア

~より汎用的なGPUコンピューティングに向いた設計へ

巨大化するIntelのGPUコア

 Intelは「Skylake」でCPUコアを拡張した。Skylakeのダイを、同じ14nmプロセスの「Broadwell」と比べると、CPUコア自体のサイズはSkylakeでかなり大きくなっていることがよくわかる。しかし、Skylake世代でも、CPUのダイ上で大きな面積を取るのはGPUコアだ。

左は4+2(4 CPUコア+GT2 GPUコア)のSkylakeのダイ。右は2+2(2 CPUコア+GT2 GPUコア)のBroadwellのダイ

 IntelもAMDも、現在はGPUコアを強化する道を突き進んでいる。Skylake世代では、72 EU(execution unit)/576個の積和算ユニットを備えた巨大GPUコア「GT4」バージョンも登場する。Skylake世代で、ついにIntelのGPUコアのピーク演算性能は1TFLOPSを越えることになる。下は、各世代のIntelグラフィックスの最大構成のコアの演算ユニット構成の図だ。Sandy Bridge世代から5世代で、Intelグラフィックスが巨大化したことがわかる。

Intelグラフィックスの各世代の最大構成コアの演算ユニット数と構成
Intelグラフィックスの各世代の最大構成コアの演算ユニット数と構成

 CPUメーカーがGPUコアを大きくする大きな理由は、電力の制約の中で性能を上げなければならないからだ。そもそも、CPUコアのシリアル実行性能を電力効率よく引き上げることは難しい。しかし、単純にCPUコア数を多くすると、チップ上で同時にオンにできないダークシリコンエリアが膨らんでしまう。これらの問題を解決するには、CPUからオフロードする、より性能と電力効率比のいいコアを搭載することだ。そのため、CPUベンダーはGPUコアの強化に努めている。

 もう1つの要因は、GPUコアを大型化する場合のボトルネックとなるメモリ帯域の問題が解決しつつあることだ。Intelはメモリ帯域を消費するGPUコアにデータをフィードするため、Haswell世代からeDRAMをCPUパッケージに組み込んで帯域を引き上げた。Skylakeでは、このソリューションを拡張する。さらに、IntelはJEDEC(半導体の標準化団体)での広帯域メモリ規格「HBM(High Bandwidth Memory)」の策定でも活動しており、将来的にはさらに広帯域のメモリをCPUに接続できるようになる見こみだ。

より小さくなったSkylakeの演算ユニット

 GPUユニットのダイエリアを見ると、Broadwell GT2よりもSkylake GT2の方が13%ほど大きい。同じGT2のGPUコアでも、Skylakeの方が肥大化している。ところが、GPUコアの中身をよく見ると、GPUのプロセッサコアが大型化しているわけではないことがわかる。大型化しているのはメディアエンジンなどの部分の方が多く、プログラマブルプロセッサとしてのGPUコア部分は大型化していない。

SkylakeとBroadwellのGPUユニットのダイの比較

 Intel GPUコアの中で、演算プロセッサとレジスタ部分であるEU(execution unit)は、特徴的なパターンでダイ上で簡単に識別できる。GPUコアの中で、8個の同じ形のユニットが並んでいる部分がEUのブロックだ。EUブロックに付帯しているのがテクスチャサンプラやキャッシュなどのブロックであると推測される。

 Intelは物理的な設計上でも各ユニットをきっちりと矩形に設計しており、ほぼ同じ物理設計のブロックを複数並べることで、スライスの構成を増やすことができるようにしている。Skylake GPUコアのうちEUを含む左側部分がスライスだと推測される。右側の長方形が、アンスライス系のユニットの可能性が高い。

 明瞭に識別できる8個のEUのブロックを比較すると、SkylakeとBroadwellでサイズが異なることが分かる。SkylakeのEUは、BroadwellのEUに対して84%程度に縮小している。機能的には同等のユニットがこれだけ縮小していることから、Skylakeではアーキテクチャ的に改良が加えられたことが示唆されている。実際Intelは、SkylakeでGPUコアの実行モードに抜本的な変更が加えられたことを説明している。アーキテクチャを実際にチェックすると、この辺りの背景が見えてくる。

Broadwell世代とそれほど変わらないGPUコアの構成

 Skylake GPUコアの3Dグラフィックスエンジン部分のマクロレベルでのマイクロアーキテクチャは、実はBroadwell世代とそれほど変わっていない。全体の構成で見るなら、特にSkylake世代で進化していないと誤解してしまうほどだ。それほどBroadwellとSkylakeのGPUコアの構成は似ている。だが、後述するように、その中身は大きく異なっている。

 IntelはGPUコアをブロック化している。まず、大きく分けると、GPUコア全体で共有する「アンスライス(Un-Slice)」とメディアエンジン群、GPUコアの中でスケーラブルに並列化する「スライス(Slice)」に大別される。スライス部分を増やすことでGPUコアの規模を大型化できる構造となっている。

GPUコアをブロック化

 Intel GPUの演算コア「EU(execution unit)」は、内部に合計で8個の32-bit単精度浮動小数点積和算ユニットを備える。Broadwell世代までは、32-bit単精度で4-wayのユニットが2個の構成になっていた。この基本はSkylakeでも変わらないようだ。Intel GPUのEUは、もともとは、4-wayの単精度積和算ユニットとスーパーファンクションユニットの構成で、スーパーファンクションユニットが4-wayの積和算ユニットとしても使えるようになったという経緯がある。

Skylakeで基本となるGT2構成のGPUコア

 8個の演算ユニットを備えたEUは、さらに8個ずつセットでサブスライスを構成している。スライスには、8個のEUのほかにテクスチャフェッチ&フィルタリングユニット「Texture Sampler/Media Sampler」と、L1/L2キャッシュが付属している。言ってみれば、サブスライスがミニプロセッサ的な構造となっている。EUとテクスチャユニットの比率は8対1となっており、これはSkylakeのGT2/GT3/GT4コアで共通となっている。つまり、演算とテクスチャの比率は、GPUの規模に関わらず固定されている。

サブスライスの構成

スライス単位でスケールアップするモジュラーアーキテクチャ

 サブスライスは3個でワンセットとなり、スライスを構成する。スライスには、サブスライスのほかに、ピクセルバックエンドやL3キャッシュなどが付属する。これらはスライスコモンと呼ばれている。GPUの下流の処理に必要なブロックを全てまとめたのがスライスだ。

Skylake世代のスライスコモン

 Skylakeでは、スライスのピクセルアウトプットは8pixel/clkとなっており、各クロック毎に8個のピクセルの書き出しができる。スライスのEU数は決まっているため、演算に対するピクセル出力の比率も固定されている。ピクセルバックエンドのフィルレイトは、Broadwell世代と比較して1.33倍~2倍に改善されたとIntelは説明している。

 スライスはGPUの処理のうち、演算、テクスチャ、ピクセルバックエンドを担当する。これらの処理はスライスとしてスケーラブルに増やすことができるアーキテクチャとなっている。それに対して、GPUを制御するコマンドプロセッサやジオメトリ/ラスタライズの固定機能ユニットは、アンスライスとしてスライスからは独立している。これらアンスライスのユニットはGPU全体で共有する。

Skylake GPUのアンスライス

 NVIDIAやAMDのディスクリートGPUでは、Intelのアンスライスに当たるジオメトリパイプなどの固定機能ユニットも複数備える。NVIDIAやAMDのジオメトリ固定機能ユニットは、Intelのスライスに当たるGPUユニットに付属している。ジオメトリ処理のスケーラビリティを追求したためだ。Intel GPUは、現状ではこうしたアーキテクチャは取っていない、つまり、ジオメトリがボトルネックとはなっていないと見ているようだ。

 GPU全体で共有するユニットには、アンスライスのジオメトリユニットのほかにメディアプロセッシングユニットがある。ビデオコーデック「Multi-Format Codec(MFX)」やビデオクオリティ処理「Video Quality Engine (VQE)」、スケーラ&フォーマットコンバータ「Scaler and Format Converter(SFC)」などだ。また、ディスプレイエンジンがシステムエージェント側に備えられている。

 ここまでを見ると、Skylake GPUコアの基本の部分はBroadwell世代と変わっていないように見える。しかし、実際にはソフトウェア実行モデルの点で、Skylakeは大きく変わった。

ベクタプロセッサの2種類の実行モデル

 従来のIntelグラフィックスの大きな特徴は、2種類の異なる実行モデルを実行できることにあった。しかしSkylakeのGPUコアでは、スカラ型1種類の実行モデルへと集約された。実行モデルはGPUのプロセッサの根幹であり、Skylake GPUコアでは、根幹の実行アーキテクチャが変更されたことになる。

 GPUはベクタプロセッサだが、その実行モデルは大きく分けて2種類がある。1つは「Array of Structures (AOS)」または「パックド(Packed)」と呼ばれる方式。もう1つは「Structure of Arrays (SOA)」または「スカラ(Scalar)」と呼ばれる方式だ。

 AOS/Packed型ではデータを一定の粒度でパックされた形で処理する。SOA/Scalar型ではあたかもシリアルな処理を複数束ねたような形で処理する。Intel CPUが内蔵する従来のショートベクタユニットSSE/AVXは、基本的にはAOS/Packed型の実行モデルだ。それに対して、現在のNVIDIAやAMDのGPUは、SOA/Scalar型の実行モデルに特化している。

16個の演算ユニットをAOSとSOAのそれぞれの実行モデルで動作させた場合の例

 伝統的なGPUは従来、SSE/AVXのような、AOS/Packed型モデルだったが、NVIDIAがGeForce 8800(G80)でSOA/Scalar型モデルへと切り替えたのを皮切りに、次第にSOA/Scalar型へと変わっていった。AMDはGCN(Graphics Core Next)への移行でSOA/Scalar型へと変わり、Imagination Technologiesは、PowerVR Series6(Rogue)でSOA/Scalar型へと変わった。

 AOS/Packed型モデルと、SOA/Scalar型モデルにはそれぞれ利点と弱点がある。おおまかに言えば、データが3~4個など決まった数のパックになっている場合は、AOS/Packed型が効率がいい。しかし、データタイプが多様な場合は、SOA/Scalar型の方が柔軟に対応しやすい。そのため、さまざまなタイプのデータを扱うGPUコンピューティングでは、SOA/Scalar型の方が有利となる。ただし、16-bitや8-bitといった、より小さなデータを扱う場合は、AOS/Packed型でユニットを分割した方が効率を上げやすい。

Skylakeで根底から変わった実行モデル

 実行モデルの転換は、GPUアーキテクチャの根幹の変更だ。通常、AOS/Packed型モデルのプロセッサは、SOA/Scalar型モデルをサポートしない。その逆に、SOA/Scalar型モデルのプロセッサは、基本的にはAOS/Packed型モデルをサポートしない。そのため、どちらの実行モデルを取るかは、ベクタプロセッサのアーキテクチャの大きな違いとなっている。

 ところがIntelは違った。Intel GPUは、これまでAOS/Packed型モデルとSOA/Scalar型モデルの両方をサポートしてきた。これはGPUとしては異例なアーキテクチャで、Intelグラフィックスの大きな特徴となっていた。ちなみに、同様にAOS/Packed型とSOA/Scalar型の両モデルをサポートするプロセッサに、IntelのLarrabeeプロジェクトがあった。Intelは、AOS/PackedとSOA/Scalarの両方をサポートすることを重視していたように見える。

LarrabeeでのAOSとSOAの説明スライド

 しかし、Skylakeでは、このアーキテクチャが根本から変わった。Skylakeのグラフィックスの実行モデルについては、IDFで次のように説明された。

 「従来のEUは、ショートベクタモード(AOS/Packed型)とピュアスカラ(SOA/Scalar型)モードの両方をサポートしていた。2系統のモードで、SIMD4x2、SIMD1x8、SIMD1x16、SIMD1x32などさまざまなフォーマットがあった。グラフィックスコアの処理のうち、ジオメトリプロセッシングは、ショートベクタモードを使っていた。ピクセルプロセッシングとGPGPUはピュアスカラモードを使っていた。いくつかのメディアプロセッシングもスカラモードだった。しかし、Skylakeからは、全てに対して常にスカラモードを使うようになった。そのため、コンパイラスタックもSkylakeで全く作り変えた」

 SIMD4x2というのは、4-wayのAOS/Packed型の実行モデルで、4個のエレメントをパック化して同時に処理するもので、4-wayのパック2個を一塊として実行する。SSEに似た実行モデルと言い換えることもできる。SIMD1x8やSIMD1x16はSOA/Scalar型の実行モデルで、1個のエレメントをScalar型で実行して、それを8個または16個ずつ束ねるものだ。現在のPC向けGPUの主流のモードだ。

 Intelグラフィックスは、このように、AOS/Packed型とSOA/Scalar型の2つの実行モデルで、それぞれ複数の実行フォーマットを持ち、それぞれが必要な処理サイクルも異なり、ベクタ幅も異なるという複雑な仕組みだった。Skylakeでは、この実行モデルが根底から変わり、NVIDIAやAMDのGPUと似たようなSOA/Scalar型のみとなった。

 実行モデルを変える大きな要素は何か。Intelは、簡素化と効率化を達成できたことだと説明する。従来は、Intelグラフィックスのハードウェアも、両実行モデルに対応する内部アーキテクチャを取っていた。これは、GPUハードを複雑にするだけでなく、ドライバも複雑化させていたと見られる。Skylakeでの、SOA/Scalar型のみへの転換は、Intel GPUコアの制御やソフトウェア層の簡素化をもたらしたはずだ。そう考えると、SkylakeでEUブロックが縮小された理由も見えてくる。

 SOA/Scalar型の実行モデルは、通常、GPUコンピューティングのような利用に向いていると言われる。AOS/Packed型は、旧来のGPUやメディアプロセッサを引きずったモデルだ。今回のSkylakeのGPUコアの改革は、GPUコアを、より汎用的なGPUコンピューティングに向いた設計に変えたとも言えそうだ。

(後藤 弘茂 (Hiroshige Goto)E-mail