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

GPUコンピューティング機能を強化したSkylakeのGPU

~タブレットの応答性が向上

GT2構成が基本となるIntelグラフィックス

 IntelはSkylak世代で、GPUコアの基本的な部分を拡張した。もっとも、Skylake GPUコア自体の構成は、Broadwell GPUコアとよく似ている。GPUコア全体で共有する「アンスライス(Un-Slice)」とメディアエンジン群とGPUコアの中でスケーラブルに並列化する「スライス(Slice)」がある。GPUコアの演算コア「EU(execution unit)」は、内部に合計で8個の32-bit単精度浮動小数点積和算ユニットを備える。ユニットは、32-bit単精度で4-wayのベクタユニットが2個の構成になっていると見られる。EUは、さらに8個ずつセットで「サブスライス(Sub-Slice)」を構成する。スライスには、8個のEUのほかにテクスチャフェッチ&フィルタリングユニット「Texture Sampler/Media Sampler」と、L1/L2キャッシュが付属している。サブスライスは3個でワンセットとなり、「スライス(Slice)」を構成する。スライスには、サブスライスのほかに、ピクセルバックエンドやL3キャッシュなどが付属する。

以前の記事のSkylake GPU GT2構成図には不足があり、こちらが完全版
PDF版はこちら

 以上がSkylake GPUコアのGT2の構成だ。Intelグラフィックスでは、現在はGT2構成がアーキテクチャ的な基本となっている。GT2コアは、スライスが1個の構成だ。Skylakeでは、スライスが2個になるとGT3、スライスが3個になるとGT4と、スケーラビリティの面ではシンプルだ。逆に、GT1とGT1.5はスケールダウンしたバージョンとなる。スケーラビリティでのBroadwellとの大きな違いは、72 EU構成のGT4が加わったことだ。GT4では、積和算ユニット数は576個となり、性能は1TFLOPSを越える。

 GT1とGT1.5はスライスユニット内の構成がGT2以上と異なるため、演算とテクスチャの比率や演算とピクセルフィルの比率が異なる。実際には、GT1とGT1.5ともGT2の機能無効版になると見られる。下の図中のGT1とGT1.5の構成は便宜的なもので、実際にはスライスの中でどのような構成でEU等が有効にされるのかが分かっていない。ちなみに、一部ユニットを無効にすることで、欠陥のあるユニットを排除できるため、GPUコアの歩留まりは上がる。

Intel GPUコアの構成の変化
PDF版はこちら
SkylakeとBroadwellのダイレイアウト
PDF版はこちら

GPUコアとCPUコアが仮想アドレス空間を共有

 Skylake GPUコアでは、実行モデルが、従来のAOS/Packed型モデルとSOA/Scalar型モデルの両サポートから、SOA/Scalar型(=SIMT:Single Instruction, Multiple Thread)モデルだけに変わった。Intelグラフィックスのアーキテクチャ上の大きな特徴だった、複雑な実行モデルと多様なモードはなくなった。現在のNVIDIAやAMDのGPUコアと似たような、よりシンプルなモデルのGPUコアとなった。NVIDIAやAMDがSOA/Scalar型アーキテクチャを取っているのは、スカラ型の実行が重要なアプリケーションが存在するGPUコンピューティングにフォーカスしているからだ。Intelも、ある程度似たような理由で実行モデルの変更を行なったと見られる。

 Skylake GPUコアでは、実行モデルの変更に合わせたように、CPUとGPUの連携やマルチタスクに重要となる機能を強化している。全体的に、GPUコンピューティング向けの機能の強化が目立つ。この傾向は、Broadwellの時から始まっており、Skylakeではそれが加速された。

 Intelは、Broadwell世代GPUコアから「共有仮想アドレス空間(Shared Virtual Address Space)」を実装した。HaswellまでのGPUコアは、CPUコアとは分離されたメモリアドレス空間を持っていた。しかし、Broadwellからは、GPUコアとCPUコア群が、同じ共有メモリアドレス空間を共有できるようになった。GPUとCPU双方のMMU(Memory Management Unit)が同期していると推測される。それによって、CPUコアとGPUコアの間で、アドレスポインタでのデータの受け渡し共有が可能となる。データの転送や同期が不要になるため、GPUプログラミングが容易になる。

 Intelは、それ以前にもソフトウェア制御の共有仮想メモリ(SVM:Shared Virtual Memory)を導入している。しかし、Broadwellから実装されたのはハードウェア制御の共有仮想メモリだ。ソフトウェア制御の粒度の大きな(ページベース)SVMと異なり、Broadwellではキャッシュライン単位での粒度の小さなSVMをサポートする。そのために、GPUキャッシュに対するハードウェアベースのキャッシュコヒーレンシもBroadwell世代からサポートした。

GPUコアとのキャッシュコヒーレンシを改善

 旧来のCPUでは、通常の内蔵GPUコアのキャッシュメモリに対しては、CPUコア側からスヌープすることができないのが一般的だ。キャッシュコヒーレンシは片方向のI/Oコヒーレンシで、通常はGPUコア側からCPUコア側のキャッシュスヌープのみの実装となっている。そのため、キャッシュのコヒーレンシを取るために、GPU側のキャッシュをフラッシュしたり、GPU側のキャッシュをスキップするなどの特殊なオペレーションが必要だった。

 それに対して、IntelはBroadwell世代からCPUとGPU間のハードウェアベースの双方向キャッシュコヒーレンシを導入した。CPU側とGPU側の両方から、互いのキャッシュをスヌープできる。そのため、Intelアーキテクチャでは、GPUコアは、あたかもCPUコアの1つのように、キャッシュコヒーレンシを保ったままメモリの共有が可能となった。

BroadwellのGPUコアのメモリ階層
PDF版はこちら

 具体的には、Broadwell GPUコアから、Graphics Technology Interface(GTI)と各スライスに含まれるL3キャッシュが「グローバリーコヒーレントメモリ(Globally Coherent Memory)」ドメインに拡張された。グローバリーコヒーレントメモリに対しての、CPUコアからのリード&ライトについては、GPU L3キャッシュに対してのキャッシュメモリスヌーピングが行なわれる。

 GPUコアからのリード&ライトも同様に、キャッシュスヌーピングでコヒーレンシが保たれる。スヌーピングプロトコルはIntelのI/O仮想化技術「Intel VT-d」に準拠している。GPU側のメモリ階層では、各スライス内のサンプラに付属するL1/L2データキャッシュはコヒーレンシは保たれない。しかし、サンプラ内のキャッシュはリードオンリーなので問題は生じない。

 Skylake GPUコアのメモリ階層とコヒーレンシの仕組みは、Broadwell世代とかなり似ていると推測される。ただし、Skylake GPUコアでは、キャッシュコヒーレンシが強化された。Intelは、これまでのキャッシュコヒーレンシには性能上のコストがあったが、Skylakeではコヒーレンシの性能が向上し、コストが低減したと説明した。また、GPUコア側のスライスに内蔵されたL3キャッシュも増量されたという。

SkylakeのGPUコアのメモリ階層の推測
PDF版はこちら

 メモリ階層では、このほか、eDRAMのキャッシュとしての制御方式が大きく変わったが、これは、将来のIntel CPUのメモリ階層全体の改革と結びついていると見られる。

GPUをCPUのように柔軟な応答性にするプリエンプション

 キャッシュコヒーレンシ以上に大きな変化はプリエンプションだ。GPUのプリエンプションの目的は、一言で言えばCPUのマルチタスク/仮想化サポートに近づけることにある。プリエンプティブマルチタスクスケジューリングでは、OSがプログラムを交互に切り替えて走らせることで、応答性のいい円滑な処理を実現できる。そのため、リッチCPUは、実行中のプログラムを一時停止して、ほかのプログラムを走らせるプリエンプションをサポートしている。それに対して、従来のGPUは、1画面の描画や1カーネルの実行を終えるまでは、ほかのプログラムを走らせることができなかった。

 現在のGPUは、このプリエンプション機能を充実させることが重要なテーマとなっている。GPU上で、非グラフィックスのアプリケーションでも柔軟で円滑な処理を実現するためと、コンピュートでの仮想化のサポートのためだ。AMDは、現在、スレッドの実行中でもタスクを切り替えられる、粒度の小さなプリエンプションをハードウェアではサポートしている。NVIDIAも同様のプリエンプションを、来年(2016年)のPascal世代で実装する予定だ。

グラフィックスの仮想化
PDF版はこちら

 IntelはBroadwell世代で、タスクスイッチをサポートしたが、グラフィクスはオブジェクト(トライアングルなど)単位だが、コンピュートはスレッドグループ単位でタスクを切り替えることができるというものだった。つまりプリエンプションの粒度が大きかった。しかし、Skylakeでは、コンピュートワークロードについて、スレッドの途中でもタスク切り替えができる機能をサポートした。Skylakeのプリエンプションで粒度を小さくしたことで、タスクの切り替えまでのレイテンシが短くなり、応答性が上がったという。

タスク切り替えのレイテンシ

 これは、スケジューラがタスク切り替えをリクエストしてから、切り替わるまでのレイテンシと見られる。スレッドグループ単位のスイッチングの場合は、スレッドグループ全体の処理を終える必要があるため、切り替えまで割り込むタスクが待たされる。それに対して、ミッドスレッドのプリエンプションでは、スレッド途中で切り替えられるため、レイテンシは最短になる。

 とは言え、ミッドスレッドのプリエンプションを実現するためには、実行中のスレッドのレジスタ内容をいったんメモリに待避して、ほかのスレッドを実行、その後、元のスレッドを復帰させる際には、メモリからレジスタ内容を再読み込みしなければならない。GPUの場合は、レジスタファイルがCPUより大きいため、コンテクストのセーブ/リストアがCPUより重い。ミッドスレッドのレイテンシは、コンテクストのセーブ/リストアのレイテンシを反映していると推測される。

 Intelは、細粒度で応答性の高いプリエンプションでは、特に2つの大きな利点があると説明する。1つは、ミッションクリティカルなワークロードの応答性の改善、もう1つは、低TDP(Thermal Design Power:熱設計消費電力)製品でのユーザー体験の改善。SkylakeのUシリーズやYシリーズといった、TDPレンジの低い製品では、GPUの動作速度が遅いが、ミッドスレッドのタスク切り替えになったことで、恩恵が大きいと言う。

 具体的には、UやYシリーズでも、数百μs(マイクロ秒)の低レイテンシでプリエンプションを行なえるようになった。そのため、タッチスクリーンのプロセッシングのGPUオフロードを、高い応答性でできるようになったと言う。タブレットなどのフォームファクタのユーザー体験を快適にすることができるとIntelは説明する。

 こうした、SkylakeのGPUの目立たないけど重要な拡張機能を見ると、実行モデルの一本化と合わせて、IntelがGPUコアを、GPUコンピューティングに向けて拡張しつつあることがよく分かる。グラフィックス処理の機能も拡張しているが、コンピューティングの拡張は、より根源的で大きな拡張が多い。増えるGPUコアのリソースを、グラフィックス以外の機能で使わせて行こうとするIntelの方針が見て取れる。

BroadwellとSkylakeのCPUコアとGPUコアの比較
PDF版はこちら

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