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

ニューラルプロセッサに対抗するArmのMali GPU

8-bit整数までのSIMDをサポートするArmのGPUコアアーキテクチャ

 ArmのGPUは、前の世代のMidgard(ミッドガルド)までは、4-wayのSIMDアーキテクチャだった。Midgardアーキテクチャでは、128-bit幅の演算ユニットが以下の構成となっている。

・浮動小数点演算系
8 x FP16
4 x FP32
2 x FP64
・整数演算系
16 x Int8
8 x Int16
4 x Int32
2 x Int64

 このように、浮動小数点演算系も整数演算系も、それぞれ演算ビット幅の分割が可能だった。伝統的なGPUのSIMDユニットに64-bitサポートを加えた形だった。それに対して、Bifrostは、SIMTになり、演算コアは基本は32-bit幅のレーンに分割された。FP32のレーンに、現在のPC向けGPUの基本スタイルと共通する。

ArmのGPUのALUの変遷。一番上が旧来のMidgardの128-bit SIMD、中央が現在のBifrostの4x32-bitのSIMT、下が新しいMali-T604の8x32-bitのSIMT
PDF版はこちら
Mali-G71の実行レーンのアーキテクチャ

 しかし、ArmはSIMTへの移行にさいして、ほかのGPUベンダ0とは異なるアプローチを採った。SIMT側アーキテクチャになると、GPUベンダーは通常は、FP32/Int32の専用演算ユニットに構成するが、Armの場合は、SIMDも32-bitレーンの中で継承した。これは、ニューラルネットワークのワークロードが勃興した現在では、適したアーキテクチャ選択となっている。

 ArmのBifrostの32-bitの演算パイプは、FP32(32-bit)単精度浮動小数点演算とint32(32-bit整数演算)が実行できるだけでなく、FP16(16-bit浮動小数点)とint16(16-bit整数)はそれぞれ2-way、int8(8-bit整数)は4-wayで実行できる。基本の4レーンの場合は下のような構成となる。

・浮動小数点演算系
4 x 2 x FP16
4 x 1 x FP32
・整数演算系
4 x 4 x Int8
4 x 2 x Int16
4 x 1 x Int32

 実際には、32-bit以外では、浮動小数点演算16-bitの演算と、整数8-bitの演算がサポートされており、Int16はFP16にトランスレートされて実行されるという。通常の単純演算はすべての精度でサポートされている。32-bit以下の精度はSIMD実行となる。Bifrostの場合は、各レーンにつき2 x FP16、4 x Int8、2 x Int16のパックドとなる。

Mali-G52からInt8のドット積をサポート

 Mali-G52からの拡張版Bifrostアーキテクチャでは、各Execution Enginesの実行レーンが4から8に倍増された。そのため、演算の並列度が高まった。Int8では、各Execution Enginesで、サイクル毎に32エレメンツのデータの処理が可能となっている。

・浮動小数点演算系
8 x 2 x FP16
8 x 1 x FP32
・整数演算系
8 x 4 x Int8
8 x 2 x Int16
8 x 1 x Int32

 加えてMali-G52では、Int8(8-bit整数)の「ドット積算(dot product)」がサポートされた。Anand Patel氏(Director of Product Management, Client Business Line, Arm)は、「Mali-G52のInt8ドット積では、1サイクル(スループット)で4つの乗算と3つの加算が可能だ」と説明する。4乗算と3加算というのはちょっとわかりにくいかもしれないが、下の図のようになる。

8レーンになったMali-G52
ArmのMali-G52のInt8ドット積の概念図
PDF版はこちら
ArmでMali-G52を担当するAnand Patel氏(Director of Product Management, Client Business Line, Arm)

 Mali-G52のInt8演算では、32-bitのスカラレジスタを、8-bitずつに分割して4個のInt8データを格納する。演算としては、まず、2つのレジスタのInt8のデータ同士を乗算する。そして、乗算の結果を、次々に加算して行く。すると、下の図のように乗算が4回、加算が3回で、4つのInt8の乗算結果をすべて加算した値を出すことができる。加算結果はInt32(32-bit整数)フォーマットとなっており、乗算でのデータが失われることがないようになっている。このあたりの実装は、NVIDIAとよく似ている。演算は3回だが、実際は4要素に対する乗算と加算なので、8オペレーションと数える場合が多い。

ニューラルネットワークプロセッサに対抗

 Int8(整数8-bit)のドット積は、ディープラーニングのインファレンス(推論)向けだ。ニューラルネットワークでは、トレーニング(Training:学習)にはFP16(16-bit浮動小数点)など相対的に高いビット精度が必要だ。しかし、端末側での認識のための推論ではデータ精度を落としても認識精度はそれほど落ちないため、8-bit整数程度の精度が使われることも多い。現在のGPUでは、推論向けでは8-bit整数(Int8)のサポートがカギとなっている。

 では、Mali-G52のケースでは、どの程度の推論が可能なのか。Mali-G52は、GPU IPに最大4個のシェーダコアを搭載できる。また、各シェーダコアには最大3個のExecution Enginesを搭載できる。そして、各Execution Enginesは、8個の実行レーンを備えている。16nmプロセスの場合は、動作周波数は最高で850MHzとされている。

Mali-G52の最大構成
PDF版はこちら
ディープラーニングにおけるトレーニングとインファレンス
PDF版はこちら

 最大構成の場合、Int8のインファレンス性能は、計算上はピークで652GOPS(Giga Operations Per Second)相当となる。iPhone Xの「A11 Bionic」に内蔵されているニューラルネットワークプロセッサ「Neural Engine」の性能は「600 billion operations per second」。

 推論用NPUでは、FLOPS(Floating Operations Per Second:浮動小数点オペレーション/秒)ではなくOPS(Operations Per Second:オペレーション/秒)が、性能の単位として使われる。これは、演算するデータタイプが浮動小数点(Floating Point)ではなく、整数(integer)が主流だからだ。Appleは600GOPSと考えていいだろう。生の処理性能的には、Mali-G52なら、ニューラルネットワーク機能を組み込んだスマートフォンに対抗できることになる。

マシンラーニング性能が飛躍したMali-G52

 性能を見ると、Mali-G52のメッセージは非常に明瞭だ。ニューラルネットワーク専用のプロセッサコアのIPを買わなくても、同レベルの処理がArmのメインストリームGPUコアでできる、というものだ。もっとも、Armもニューラルネットワークプロセッサには取り組んでいるはずで、Mali-G52はあくまでも選択肢の1つだろう。

ニューラルネットワークにより特化しているNPU

 では、ニューラルネットワーク専用プロセッサ(NPU)に対して、Mali-G52のような低電力GPUでのニューラルネットワーク処理はどうなのか。ダイ面積的には、Mali-G52のようなソリューションの方が有利となる。NPUが占有するダイ面積が不要になる一方、GPUコアに付加しなければならない面積はたいした量ではないからだ。追加のIPの開発や購入が不要になり、コストは抑えられる。

 しかし、電力消費になると話が違ってくる。現状では、専用のNPUを使う最大の利点はそこになる。まず、推論向けNPUでは、演算ユニットはそもそも整数ユニットのみで、電力消費が少ない。GPUも整数演算ユニットしか使わないとはいえ、アイドル状態の浮動小数点演算ユニットでリーク電流が発生する。整数演算ユニットだけのNPUの方が圧倒的に有利だ。

 データ精度で言えば、推論では8-bit以下の整数もサポートし、さらにミックスできるバリヤブル(変更可能)なデータ精度のNPUアーキテクチャも出てきている。必ずしも8-bitが常に必要とされているわけではない、という考え方だ。また、よりアグレッシブに電力を制御するための数々のテクニックを取りこみつつある。

 一例を挙げると、オンチップメモリの活用による、メモリアクセス電力の低減がある。ニューラルネットワークでは、膨大な量のウエイトデータアレイへのアクセスが必要となる。ウエイトデータを、圧縮してオンチップの組み込みメモリに収めてしまうと、電力節減の効果が大きい。動作時の外部メモリへのアクセスを大幅に減らすことが可能となるからだ。消費電力は大幅に下がり、モバイルの電力枠の中で、高レスポンスの推論が可能になる。

 データ圧縮のアプローチの中でも圧縮度が高く重要なのは推論での「プルーニング(Pruning:剪定)」だ。推論のための学習済みのニューラルネットワークの中で、重要度が低いコネクションを削り、そのコネクションのウェイトデータを削除する。ハードウェア的には、圧縮したウエイトデータをメモリ上でそのまま扱う仕組みや、演算時にスキップする仕組みが必要となる。

プルーニングの概念図
PDF版はこちら

 低精度の整数演算のみで、特殊な省電力アーキテクチャを備えたNPUに対して、GPUによるニューラルネットワークプロセッシングは、どうしても消費電力面では不利となる。そのため、コストよりバッテリ駆動時間を重視する場合には、Mali-GPUにニューラルネットワークもやらせるという選択肢ではなくなりそうだ。

 GPUにNPUのようなニューラルネットワークに特化した機能を組み込むこともできる。しかし、今の段階では、それはGPUの肥大化を招き、まだ実際的ではない。もちろん、将来的に、GPUがそちらに舵を切る可能性もあるが、まだGPUはグラフィックスワークロードを主体に設計する段階だ。

 こうした状況を考えると、Mali-G52でのディープラーニングプロセッシングは、NPUをコスト的に搭載しにくいが、ニューラルネットワークによるユーザーインターフェイスの改革には対応したいというニーズに合わせたソリューションに見える。その意味では、メインストリームGPUのMali-G5x系から実装するのは、理にかなっている。

タイリングに最適化したGPUアーキテクチャ

 実行レーンのワイド化など、PC向けGPU的な拡張を加えたMali-G52の拡張版Bifrostアーキテクチャだが、PC向けGPUとは大きく異なる点も多い。とくに異なるのは、タイルメモリの存在と、ROP(Rendering Output Pipeline)がGPUコア側に含まれる点。

 ピクセルに対する、ブレンディングやZテストなど最終的な処理を行なうROPは、ディスクリートGPUタイプのアーキテクチャではメモリコントローラ側に配置されている。それに対して、SoCへの組み込みを前提としたArmでは、ROPはGPUの演算ユニットアレイに近い側にある。そして、ROPはGPUコア間で共有ではなく、各GPUコア毎に、ROPが1セットずつ組み込まれている。

Mali-G52のシェーダコアブロック図
PDF版はこちら

 Armがこうしたアーキテクチャを採るのは、GPUコア単位でのスケーラビリティを重視しているためだ。顧客のチップベンダーが、自由なコンフィギュレーションでGPUを設計できるようにするためには、GPUの演算対ROPは一定比率にして、GPUコア側にROPまで組み込んでしまった方が面倒がない。

 もう1つの要素は、ArmのGPUがタイリングアーキテクチャであることだ。ROPがアクセスするのは基本はオンチップメモリのみなので、メモリインターフェイスと直結させる必要がない。Bifrostアーキテクチャでは、GPUコア毎にタイルメモリを持ち、ROPはそこにピクセルを書き込む。

Bifrostからはジオメトリデータを段階的に読み込むタイリング方式を採用

 Mali-G52のスペックでは、ROPのピクセル出力は、最大構成(4GPUコア)でピクセルレートは6.8 Gpixels/secとなっている。動作周波数が850MHzとすると、毎クロック8ピクセルの出力の計算となる。そのため、GPUコアあたりのROP出力は、2ピクセル/クロックと見られる。ちなみに、同じBifrostアーキテクチャでも、高性能コアのMali-G7系ではROP出力は1GPUコアあたり1ピクセル/クロックだった。

 G52の方がコアあたりのROPが多いのは、GPUコア数が少ないが、一定の画面解像度をサポートしなければならないメインストリーム向けGPUの仕様と推測される。G72は32コアまでをサポートしており、実際にG7x系はコア数の多い実装例が多い。そうすると、GPUコア毎にROPが1ピクセル出力でも、GPUコアとともにスケールするROP数は多くなる。

 それに対して解像度はそんなに増えないので、バランスとしては悪くない。Mali-G7xの方が演算対ピクセル出力では、演算の比率が高くなる。しかし、パフォーマンスGPUコアで走らせるのはシェーダプログラムが複雑なコードになるので、その点でもバランスは悪くない。

 ちなみに、G52のスペックにはピクセルとテクスチャリングのスループットが6.8 Gpixels/secと記載されている。そのため、テクスチャユニットのフィルタリングスループットも2ピクセル/クロックと推測される。