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

スマートフォンのグラフィックスを加速する「PowerVR Series6 Rogue」

PowerVRの基本の設計思想を変えるRogueアーキテクチャ

 Imagination Technologiesは、PowerVRアーキテクチャを、従来のPowerVR Series5/5XT系から新世代の「PowerVR Series6(Rogue)」へとシフトさせている。アーキテクチャを一新したPowerVR 6系列は、昨年(2013年)から実際の製品に搭載し始めている。「iPhone 5s」のA7 SoC(System on a Chip)にも採用された(Appleは正式にはRogueであることを発表していない)。モバイルGPUのパフォーマンスを数100GFLOPSのレンジに伸ばすSeries6(Rogue)のアーキテクチャをまとめてみた。

 RogueはImagination Technologiesにとって過去最大のアーキテクチャ変革となる。PowerVR Series5/5XTと異なるだけでなく、基本的な設計思想がそれまでのPowerVRの系譜と異なっている。最大の違いは実行ユニットの構成が、ワイドベクタ構成になったことだ。PowerVR Series5/5XTまでのPowerVRの実行ユニットは、128-bit幅で32-bit単精度浮動小数点演算では4-wayのベクタユニットだった。GPU用語では「Vec4」と呼ぶ実行ユニットタイプだ。

PowerVR Series6(Rogue)のアーキテクチャ

 それに対して、Rogueの実行ユニットは16-wayのベクタユニットだ。16の演算ユニットが同じ命令を実行するが、フローコントロール制御ができる。16-wayの命令ストリームは、擬似的に個別の命令フローを取ることができる。これは、NVIDIAや現在のAMDと類似のアーキテクチャだ。

16-wayのALUを基本単位とするRogue実行クラスタ

 Rogueアーキテクチャを、もう少し詳しく見ると下の図のようになる。PowerVR Series5XTでは、GPUコアをマルチコア化してコア数を増やすことで演算パフォーマンスを増やしていた。それに対してPowerVR Series6(Rogue)アーキテクチャでは、1個のGPUコアの中に、Coarse Grain Scheduler(CGS)で制御されるプロセッサクラスタを複数個載せることができる。GPUコアの中のクラスタを増やすことで、演算プロセッサ数を増やすアーキテクチャとなっている。

PowerVR Series6(Rogue)の構成(※PDFはこちら)

 上の図はPowerVR G6630の構成の例で、GPUのアレイに合計で6個のクラスタ「USC(Unified Shading Cluster)」が含まれている。次期Rogueは、これにさらにレイトレーシング支援ハードウェアが加わるが、基本の構成は同じだ。各クラスタがそれぞれ16 ALUの構成なので、PowerVR G6630は合計96 ALUの構成となる。Rogueアーキテクチャの命令実行の基本単位は、この16-wayのUSCだ。16-wayのALUが同じ命令を実行する、言い換えれば、16個のALUが同じプログラムカウンタを共有している。

 16-wayのALU群は同じ命令を実行するが、それぞれ異なるインスタンスを実行する。また、16-wayのALUは、マスクレジスタを備えてプレディケーションによるフローコントロールもできる。NVIDIA用語で言えばSIMT(Single Instruction, Multiple Thread)型のアーキテクチャとなっている。レジスタは、個々のインスタンス専用のプライベートレジスタ「Unified Store Registers」と、インスタンスにまたがって共有される「Common Store Registers」がある。重複するシェーダユニフォームやコンスタンスは効率的に共有ストアされる仕組みだ。

PowerVR Series6のUSC

 USCのALUは、それぞれが3個の演算ユニットを備えている。32-bit単精度の浮動小数点積和演算ユニットが2個と、超越関数などの実行のためのスーパーファンクションユニット(Super Function Unit:SFU)が1個の3個だ。3ユニットに対して、1サイクルで最大3命令の発行が可能だ。2ユニットは積和算ユニットなので合計で最大5FPオペレーション/サイクルとなる。積和算ユニットの片方は整数演算も実行する。

 一方、Rogueの前世代のPowerVR Series5では、GPUコアアーキテクチャは大きく異なる。下は最大構成のPowerVR SGX554の構成だ。GPUはフル機能を備えたコア単位で構成されている。実行ユニットは128-bitのSIMD(Single Instruction, Multiple Data)ユニットで、このユニットは32-bit/16-bit/8-bitに分割可能となっている。浮動小数点が32/16-bit、整数が32/16/8-bitだ。32-bit時には4-way、16-bit時には8-wayと、演算のビット幅が狭まると並列性が上がりスループットが高まる仕組みだ。

PowerVR Series5(SGX554)の構成(※PDFはこちら)

スカラへと変わった実行

 PowerVR Series5からPowerVR Series6(Rogue)への変化で重要なポイントは、実行スタイルがパックド(Packed)からスカラ(Scalar)へと変わったことだ。「従来の5/5XTでは、最大のスループットを得るにはVec4に合わせてベクタ化する必要があった。しかし、Rogueは完全なスカラベースなので、開発者はもうベクタ化する必要がない」とImagination TechnologiesのKristof Beets氏(Senior Business Development Manager, PowerVR Graphics, Imagination Technologies)は語る。

 従来のPowerVR Series5は「Array of Structures(AOS)」または「パックド(Packed)」と一般に呼ばれるデータ配列に特化した演算ユニット構成を採っていた。それに対して、Rogueは「Structure of Arrays (SOA)」または「スカラ(Scalar)」と呼ばれる方式を採る。下の図の例は、16レーンのベクタユニットでAOSとSOAそれぞれのデータを実行する例だ。

Series5のAOSと、Series6のSOAのデータ実行(※PDFはこちら)

 Array of Structures(AOS)に合わせた実行では、RGBAの4データのパックを4個並べて16レーンを埋める。つまり、各サイクルに、4ピクセルを同時に処理する。それに対して、Structure of Arrays(SOA)に合わせた実行では、16個のピクセル全てのデータをRGBAの順番に処理して行く。例えば16ピクセルの中のRに対して命令を実行し、次に16個のGに対して命令を実行する。

 上のSIMD(Single Instruction, Multiple Data)命令の例では、どちらも16ピクセルのデータを4サイクルで処理できる。しかし、これがスカラ命令になると話が違ってくる。下の図はGPUアーキテクチャと命令種類による実行効率の例だ。上がSIMD命令、下がスカラ命令だ。左が4-way SIMD構成の演算ユニットの場合、右がSIMT構成の場合、中央が以前のAMDアーキテクチャのVLIW(Very Long Instruction Word)構成だ。SIMTの場合は、理論上、SIMDでもスカラでも同様のスループットで実行できる。ところが、AOSに特化した4-way SIMDでは4分の1の実行ユニットしか埋まらない。

GPUのアーキテクチャと命令実行の仕組み(※PDFはこちら)

マスクレジスタによるプレディケーション制御

 4-way SIMDだったPowerVR Series5では、この例で分かるようにパック化しなければフルのスループットで実行できなかった。しかし、PowerVR Series6(Rogue)では、パック化しなくてもフルスループットで実行できる。これは、4-way SIMD以外のデータタイプが増えた最近のシェーダプログラムや、汎用のコンピューティングプログラムで大きな力を発揮する。

 16-wayの相対的にワイドなベクタの場合の問題は、コントロールフローだ。PowerVR Series6(Rogue)の場合は16レーンの16インスタンスに全て同じ命令を実行する。16-wayでプログラムカウンタは1つで、レーンによって命令フローが条件分岐するような場合は、問題が生じてしまう。そのため、GPUベンダーはマスクレジスタを使ったプレディケーションを行なうのが一般的だ。

ベクタ条件分岐(※PDFはこちら)

 プレディケーションでは、各レーンのスレッド毎に、命令を実行するかしないか(または演算の結果をレジスタに書き込むか書き込まないか)をマスクレジスタによって選択できる。プレディケーションを使えば、レーン上のスレッドに条件で分岐が発生しても、あたかも分岐したかのように見せかけることができる。Rogueではこの手法で、16-wayでの条件分岐を実現している。そのため、実質的に16-wayの各ALUはスカラユニットとして扱うことができる。ワイドなベクタ構成を、スカラと呼んでいるのはそのためだ。

条件分岐処理

 こうした仕組みで、PowerVR Series6(Rogue)では、USCの中の16-wayのALUが同じ命令を実行しながらフローコントロールを行なう。ちょっと複雑なのは、個々のALUはそれぞれ3個の演算ユニットを備えていること。1個のALUの中の3個の演算ユニットは、ほかのALUの3個の演算ユニットと同じ命令を共有している。そのため、論理的なビューは下の図のようになる。

PowerVR Series6の論理的な構造(※PDFはこちら)

 NVIDIAのKepler(ケプラ)やAMDのGCN(Graphics Core Next)も、演算ユニットは16-wayの構成だ。しかし、論理的なSIMTサイズは、NVIDIAが32スレッドのWarp、AMDが64スレッドのWaveFrontだ。それらのバンドルをNVIDIA Keplerは2サイクル、AMD GCNは4サイクルかけて実行する。Rogueの場合は、どうなのか。

 Rogueは基本はOpenCLの推奨サイズである32スレッド単位で実行するが、16スレッドでも実行できるという。32スレッドの場合は2サイクルかけて実行し、16スレッドの場合は2サイクル目をスキップできるという。例えば、32スレッドの後半の16スレッド全てが分岐によって実行する必要がないと検知した場合はスキップする、とBeets氏は説明する。

電力効率がアーキテクチャ変更の最大の理由

 PowerVR Series5では、個々のピクセルまたは頂点単位でプログラムカウンタを備えていた。つまり、4-way SIMD単位でプログラムカウンタがあり、プレディケーションではなく真の条件分岐が可能だった。それに対して、Rogueは16-way SIMD単位でプログラムカウンタで、プレディケーションを使う。フローコントロール制御の粒度が大きくなり、命令ユニットと実行ユニットの比率では、実行ユニットの比率が大きくなっている。この変化について、Imagination Technologiesは次のように説明する。

 「コストと電力の問題だ。高い効率は、優れた電力効率を意味する。ポイントは、最も一般的なケースに最適化することだ。全てのスレッドが異なる方向に条件分岐することは極めて希なケースだ。一般的なケースは、ほとんどの頂点やピクセルが同じ方向へとフローすることだ。

 我々がPowerVR 5SGXのワークロードを解析して発見したのは、あまり細い粒度での制御は意味が無いということだった。まれな(多くの分岐が発生する)ケースに最適化しても、そのためのコストを埋め合わせるだけの利点がないだろう。1%以下の可能性のシナリオのために、5%も電力が上がるとすれば、それはいい選択ではない。それが、我々がアーキテクチャを変更した理由だ」。

 この変化の背景にはモバイル機器自体の変化もある。旧来のモバイルGPUは、PowerVR Series5やMali-T6xxなど、ピクセル/頂点単位でプログラムカウンタを備えてフロー制御を行なっている例が多かった。これは、旧来のモバイル機器の画面解像度が低かったことと密接に関係している。解像度が低ければ、個々のピクセルや頂点が個々に分岐する可能性も高まる。しかし、解像度が上がれば、ピクセルや頂点が同じ方向へとコヒーレントして分岐する可能性が高まる。そうなると16-wayでの制御が合理的で効率的なソリューションになる。

モバイルGPUのコントロールフロー(※PDFはこちら)

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