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

1TFLOPSのNVIDIAモバイルSoC「Tegra X1」

20nmプロセス世代のNVIDIAモバイルSoC

 NVIDIAがモバイルSoC(System on a Chip)「Tegra」シリーズの次のフラッグシップ「Tegra X1」を発表した。64-bit ARMv8 CPUコアと、256個のCUDAコア(積和演算ユニット)のGPUコア、LPDDDR4、4Kディスプレイ対応を備えたハイエンドモバイルチップだ。64-bit CPUと、高性能のCUDA GPU、広帯域メモリ、高解像度ビデオエンジンなどを網羅する2015年のハイエンドSoCとなる。

Tegra X1

 Tegra X1では、GPUコアはマイクロアーキテクチャを最新の「Maxwell(マクスウェル)」に変更し、CUDAコアの演算ユニット数を256ユニットへと大幅に増やした。アーキテクチャの世代で、PC向けGPUと並んだことになる。GPUコアの演算性能は最高1TFLOPS(テラフロップス)を達成する、モバイルスーパーコンピュータだ。ただし、後述するが、1TFLOPSはパックドFP16(パック型の16-bit浮動小数点演算)の性能だ。また、最高性能での電力消費は10W以下となる。

 製造プロセスはTSMCの20nm SoCプロセスで、AppleのiPhone 6/6 PlusのA8系と同じプロセスだ。また、CPUコアはARMの64-bit拡張を含むARMv8命令セットアーキテクチャになった。ARMのCPUコアIPのCortex-A57が4コアにCortex-A53が4コアの4+4構成で、ARMのbig.LITTLEソリューションと似たような構成となっている(ただしbig.LITTLEのハードウェア/ソフトウェア構成とは異なる)。つまり、CPUコアが8個、CPUは積和演算ユニットが256個の構成のSoCだ。CPUコアは、NVIDIA独自の64-bit ARMv8コア「Project Denver」ではないところが面白い。それについては別記事で解説する。

Cortex-A57の概要
Cortex-A53の概要
Cortex-A57のパイプライン

 今回のプロセス移行はイレギュラーで、単純に28nm→20nm→16/14nmとはならない。ファウンダリプロセスの20nmと16/14nmプロセスは配線層の多くを共有し、20nmがプレーナトランジスタ、16/14nmがFinFET 3Dトランジスタとなる。20nmの利点は16/14nmより1年先にプロセスが立ち上がっていることで、16/14nmの利点はより電力を抑えられること。少しでも微細化したプロセスが欲しいモバイルSoCは20nmへ向かうが、その他の製品の多くはより利点が多い16/14nmに移行すると言われている。実際、IPの充実度も16/14nmの方が高く、20nmはモバイル専用のプロセスになりつつある。NVIDIAも、AppleやQualcommと同様に、モバイルでは20nmを選択した。

各社のプロセス技術のピッチ比率(PDF版はこちら)
Intelとファウンダリのプロセスロードマップ(PDF版はこちら)

モバイルに最適なMaxwellアーキテクチャ

 NVIDIAは28nm HPMプロセスのTegra K1では、「Kepler(ケプラ)」GPUコアアーキテクチャを採用した。Keplerは192個のCUDAコアで1個のSM(Streaming Multiprocessor)を構成するアーキテクチャとなっていた。SMには4個のwarpスケジューラがあり、4warpから最大8命令をディスパッチできる。それらの命令がバンドルに分かれた192個の演算ユニットにディスパッチされるアーキテクチャだった。

Tegra K1に搭載されたKepler GPUコアのSM(PDF版はこちら)

 Keplerアーキテクチャの特徴は、命令がフルにディスパッチされると演算ユニットをフルに回転させることができる点。言い換えれば、注意深くチューニングすれば、命令発行に対する演算実行の効率をフルにして、高性能を引き出すことができる。しかし、実際にはそれだけ効率のいい命令発行ができるケースは多くなく、演算ユニットがアイドルになってしまうケースが多かったとみられる。また、複雑な命令ディスパッチネットワークやスケジューリングは、そのままハードウェアオーバーヘッドとなっていた。

 Maxwellアーキテクチャは、Keplerをベースにしながら、そうした問題を取り去り、GPUコアをより効率のいいマイクロアーキテクチャにした。命令ディスパッチャにCUDAコアのバンドルを1対1で対応させた。この改良により、命令スケジューリングとディスパッチ、それに配線ネットワークはシンプルになった。また、命令発行に対する演算の比率が下げられたことで、演算ユニットの無駄なアイドルも大幅に減ったとみられる。つまり、MaxwellはKeplerよりも、アーキテクチャ面で非常に効率が高い。本来的に、Maxwellの方がKeplerよりもモバイルSoCには向いたコアだ。なぜなら、NVIDIAはMaxwellからモバイルへの転用を前提としてアーキテクチャ開発を行なっているからだ。

Tegra X1に搭載されたMaxwell GPUコアのSM(PDF版はこちら)
Maxwellアーキテクチャの命令スケジューリングの例(PDF版はこちら)
KeplerとMaxwellの命令発行と実行ユニットの比率(PDF版はこちら)
Tegra X1のMaxwell SM
2 SMで構成されるTegra X1のMaxwellコア
Tegra K1とTegra X1のグラフィックス構成と性能の違い

 Tegra X1に搭載されたMaxwellコアは128 CUDAコアのSMが2ユニット。合計で256 CUDAコアの構成となる。NVIDIAはKepler GPUコアの192 CUDAコア構成のSMに対して倍以上の性能としているがアーキテクチャを考えればそれも不思議ではない。Tegra X1向けMaxwell SMは、基本的な設計はPC向けのMaxwell SMと同じだが、メモリ量などに若干の違いがある。もちろん、製造プロセス技術は異なり、PC向けGPUコアは同じTSMCの28nm HPプロセスだが、Tegra X1はTSMCの20nm SoCプロセスで製造される。そのため、プロセスやトランジスタオプションなどだけでも電力消費が下がる。

 モバイル向けのKeplerコアはテクスチャユニット数がPC向けより半減されていた。そのため、Tegra X1のMaxwellコアは、Tegra K1のKeplerコアよりも演算に対するテクスチャの比率が高まる。また、Tegra K1 Keplerでは4ユニットだったROP(Rendering Output Pipeline)が、Tegra X1 Maxwellでは16ユニットへと4倍に増えている。これらは当然メモリ帯域に負担をかけるが、メモリインターフェイスは64-bit幅でLPDDR4 3.2Gbpsがサポートされており、メモリ帯域も25.6GB/secへと増えている。また、2 SMの構成になったため、ジオメトリパイプラインも2倍の数になっている。

モバイルメモリ帯域ロードマップ(PDF版はこちら)

16-bit浮動小数点データを2個パック化して演算

 Tegra X1のMaxwell GPUコアの最大のハイライトは、「パックドFP16(16-bit浮動小数点演算)」のサポートだ。

 CPUの浮動小数点演算では、一般的に単精度と呼ばれる「FP32:32-bit浮動小数点(符合1-bit/指数8-bit/仮数23-bit)」や倍精度と呼ばれる「FP64:64-bit浮動小数点(符合1-bit/指数11-bit/仮数52-bit)」が使われる。だが、グラフィクスでは、以前から「FP16:16-bit浮動小数点(符合1-bit/指数5-bit/仮数10-bit)」が多用されていた。これは、人間の眼の輝度ダイナミックレンジのかなりの部分を16-bit浮動小数点でカバーできるからだ。

 NVIDIA GPUコアは、GeForce 8800(G80)以降は、FP32に最適化されたCUDAコアで構成されるようになった。従来のCUDAコアでは、1つのFP16オペレーションは、1つのFP32(32-bit浮動小数点演算)コアで実行されていた。そのため、FP16のスループットはFP32と同じだった。つまり、FP16に演算精度を落としても、FP32性能は上がらなかった。

 Tegra X1のMaxwellコアでは、この部分を大きく変更。FP16オペレーションのスループットを、FP32の2倍にした。フルの1GHz動作時のTegra X1 GPUコアでは、FP32の性能は512GFLOPSだが、FP16の性能はその2倍の1TFLOPSになる。

Tegra X1のFP16パフォーマンス

 ただし、この場合のFP16は、2-wideベクタ形のパックドフォーマットを使ったオペレーションとなる。GPU用語的に言えば「Vec2」だ。NVIDIAの従来の命令実行は、1-wideのスカラオペレーション(実際には32-wideベクタだが、プレディケーションによって条件分岐を可能にしてスカラのように見せている)だ。しかし、Tegra X1の2-wide FP16は異なり、SSEのようなSIMD(Single Instruction, Multiple Data)のオペレーションとなっている。

 具体的には、Tegra X1 Maxwellでは、CUDAコアの32-bitレジスタを2つに分割、アッパーハーフ(上位)16-bitとローワーハーフ(下位)16-bitに、それぞれ16-bitのFP16データを格納できるようにした。CUDAコアは32-bitレジスタから2つのFP16ソースオペランドを読み出し、2つの同じFP16オペレーションを平行して実行する。そして、演算結果を再びパック化して32-bitレジスタに格納する。

16-bit浮動小数点演算データを2個パックにして実行する新しい実行モード(PDF版はこちら)

 例えば、FMA(積和算)なら、3つの32-bitレジスタをソースオペランドとして読み出し、3つの16-bitソースを2セットを取り出して同じ積和演算命令を両方に対して実行、結果を1つの32-bitデスティネーションレジスタに書き込む。1個のFP32 CUDAコアが、2個のFP16オペレーションを並列実行できるため、Tegra X1のFP16のスループットは、FP32の2倍となる。

GPUにとっては回帰となるFP16パフォーマンス

 Tegra X1のパックドFP16は、FMA(フューズド積和算)、ADD(加算)、MUL(乗算)といった単純命令でサポートされる。言い換えれば、全ての命令でサポートされるわけではない。ハードウェア的には、CUDAコアの演算ユニットはFP16をサポートするが、超越関数などを扱うSuper Function Unit(SFU)はFP16をサポートしないことになる。

 FP16を扱える命令と扱えない命令があるため、当然、32-bitレジスタに16-bitデータをパックする命令とアンパックする命令も追加されるとみられる。従来のNVIDIA GPUとは異なり、FP16については、ベクタをプログラミングモデル上である程度意識する必要が出る。ただし、FP16が主ターゲットとするようなアプリケーションは、画像のようにパックドデータが基本のものばかりだから、それでも問題はあまり生じないという判断だろう。

 パックドFP16の導入は、NVIDIA GPUにとっては回帰のように見える。PC向けプログラマブルGPUは、DirectX 9世代で浮動小数点(FP)フォーマットをFP16から導入スタートした。また、現在のようなSIMT(Single Instruction, Multiple Thread)スタイルとなる前のGPUは、4-wideのパックド型の「Vec4」ベクタフォーマットに特化したプロセッサだった。SSEのような、32-bitで4-wideのSIMD(Single Instruction, Multiple Data)構成を発展させて、部分的に分割して複数命令を実行できるようにしていた。そのため、FP32の4-wideベクタを、FP16の8-wideベクタとして使うといったアーキテクチャも多かった。

 現在も、ARMのMali-T6xx以降の「Midgard(ミッドガルド)」アーキテクチャは、この方式を取っており、4-wideの128-bitベクタユニットを、8xFP16と4xFP32のどちらでも使うことができる。FP16時にはFP32の2倍のスループットとなる。

ARMのMali T600系のALUは128-bit幅のSIMDになっており、FP16に分割可能(PDF版はこちら)

 現在、モバイル向けGPUは、FP16重視の方針を採っている。Imagination Technologiesも、PowerVR Series6(Rogue)では最初はFP16のスループットをFP32と同等にすると説明していたが、現在のPowerVR 6/7ではFP16のスループットはFP32の2倍に変わっている。FP16の性能重視の度合いが、PC向けGPUとは異なっている。

今後のモバイルGPUにとって重要となる低精度の演算パフォーマンス

 なぜFP16の性能がモバイルGPUコアでが重要なのか。これにはいくつかの理由がある。NVIDIAにとって最も重要な理由は、画像認識などのイメージプロセッシングアプリケーションでFP16が多用される傾向にあること。画像認識では、演算量が膨大に膨れ上がる。そのため、データ量を減らすのと同時に、演算性能を上げたい。FP16処理では性能が2倍になるGPUは、画像認識などの処理にはうってつけとなる。

NVIDIAが車載向けにリリースしたTegra X1ベースのDrive CXコンピュータモジュール

 NVIDIAは、現在、車載システムをモバイルSoCの重要ターゲットとしている。車載でGPUの強味が活かせる重要部分の1つは、画像認識システム。オートドライブのカギとなるのは、カメラで捕らえた周囲の画像の認識処理であり、FP16を強化したTegra X1は強味を発揮する。

車載コンピュータに要求される画像認識

 しかし、電力が非常に重要なモバイルグラフィックスにおいても、FP16は有効だ。データ量を減らして省電力化できるからで、演算での電力消費も半分になるのなら、さらにFP16の利点は大きい。ピクセルではFP32までの精度は、多くの場合必要ないからだ。実際、NVIDIAもTegra 4世代では、モバイルグラフィックスではFP32はまだ必要が低いとしてFP20精度を採用していた。NVIDIA以外のベンダーがFP16を重視しているのは、こちらの理由の方が大きいとみられる。

 また、今回、NVIDIAは浮動小数点演算の16-bitしか言及していないが、将来的には16-bit整数演算の性能も重要になる可能性がある。それは、センサーから吸い出すデータが16-bit以下の整数データが多いからだ。8-bitや10-bit、12-bitといった精度がばらばらのセンサー整数データは、16-bitの整数演算ユニットの方が、32-bit整数演算ユニットより効率的に処理できる。そうしたセンサーデータの解析をもっとクライアント側で行なうようになると、16-bit以下の整数演算の性能と性能/電力も上げる必要が出てくる。

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