各社GPU SDK比較

組み込みGPUを販売している各社は、各々のGPUに対応したSDKも同様に提供している。なんというか、各社の経験なども見えて興味深い。
多くのSDKNDAで保護されているので、パフォーマンスを含めた使い勝手レビューを書けないのが微妙。(各社のプレゼンなど公開資料で書かれていないものはこっちにも書けない - youtube等で検索すると公式動画が置いてあることはそれなりに有るが。。)

一般的なSDK構成

基本的に、SDKは以下のコンポーネントとドキュメントで構成されることが多い。

  • シェーダのオフラインコンパイラAndroid端末本体に内蔵されているコンパイラと同様のものをWindowsで動作させられるようにCLIを付与したものが多い。
  • テクスチャのエンコーダ/圧縮ツール。OpenGL ES2.0で標準化されているテクスチャ圧縮はちょっと残念なスペックなので、各社のGPUは独自のテクスチャ圧縮アルゴリズムを提供している。これらのためのオフライン圧縮ツールを提供している。これを提供していないSDKは無いようにみえる。テクスチャの圧縮はメモリ帯域の削減に直結するため、組み込みGPUでは非常に重要なものとなる
  • APIエミュレータGPUで提供しているOpenGL ESなどのAPIをエミュレーションするためのDLL類。特にOpenGL 4.x時代が来るまではデスクトップでOpenGL ESは使えないも同然だったので、それなりに存在意義があった。
  • パフォーマンスカウンタの収集/表示ツール。個々のGPU最適化では中心的ツールになるが、サポートの幅は様々。
  • ドキュメンテーション

これらの枠に当てはまらないツールは興味深い。たとえば、Adrenoは専用のアセットオプティマイザを提供している。AdrenoとNvidiaはさらにCPU側の専用コンパイラを提供している。
IMG、QualcommnVidia、ARMのドキュメントはそれなりの最適化ガイドを含んでいて参考になるのでオススメと言える。手元に実機がなかったとしてもひと通り読んでおきたい。OpenGL ESなゲームエンジンをデザインするまえに、これらのドキュメントで推奨されている実行スタイルの実装を前提にすることが必要になる。(例えば、帯域を節約するために背景を最後に描くといったテクニック等。)

パブリックにSDKを提供していないベンダ

BroadcomVideoCoreはRaspberry Piのような有名なDesign winが有るのにSDKが公開されていない。あまり熱心にVideoCore向けの最適化を行う人はいないんだろうか。。
日系のベンダもSDKを提供していない。Nintendo 3DSで有名になったDMPはOpenGL ES 2.0のコア(SMAPH)も提供していてSDKも存在するが、一般には提供されていない(そもそもDesign winが無いので、一般開発者がコードを動作させる方法が無い)。DMPはセミナを提供しているので、そこで触ることはできる。
PC-FXGAの血を引くTAKUMIもOpenGL ES 2.0のコアを提供しているが、このコアのことは全く知らない。
(他にも色々なConformant productsが有る: http://www.khronos.org/conformance/adopters/conformant-products#opengles )
いわゆるメジャーなGPUベンダは全て何らかの形でGPU SDKを提供している。ただ、VivanteはGPUベンダとしてはSDKを公開していないのと、Androidで動作する良いソリューションが存在しないので、コミュニティからはあまり良くサポートされていない。

Vivante以外のSDKは甲乙つけがたい。ダウンロードに登録が必要な物が多いが手間を掛ける価値があると思う。
VivanteとIMG以外はCPUコアも提供している点は興味深い。IMGはMIPSを買収したので別枠として、純粋なGPU IPベンダはVivante(と、SDKを公開していないDMPなど)くらいだろう。

Intel

Intelをココに挙げるのもどうかと思うが、一応x86 Androidに対応したソリューションも提供しているので。。もっとも、Intelは強力なWindowsプラットフォームを提供しているわけで、ホスト側で動作させるという方法でどうにでもなる。
一部のIntelチップセットPowerVRを採用しているが、これらではIMGのPowerVR SDKAPIトレースやパフォーマンスカウンタの取得等を含めてそのまま使用できる。
CPUベンダらしくパフォーマンス解析に関する考察も行き届いていてそれなりに品質は高い。
Intelは今後もIris GPUを押していくので、サポートも期待できる。モバイル市場でのIntelの立ち位置は絶妙なところだが。。

IMG

PowerVRを擁するIMGは完成度の高いSDKを提供している。無改造端末で使用できる強力なAPIトレース(PVRTrace)とビューア(PVRScope、PVRTune)があり、最適化のためのドキュメントも充実している。
APIエミュレータ(PVRFrame)の完成度も高い。Win32/64等に加えて、MacOSもサポートしている。
オフラインシェーダコンパイラは個々のIPごとに用意されている。ただし殆ど差はない(基本的にSeries5/6の2択になるため)。
PowerVRには歴史と伝統のある自前のモデル/テクスチャバイナリフォーマットが有るため、これらに対するエクスポータも揃っている。
GUIツールのツールキットはQtを採用している。

Qualcomm

Adrenoを擁するQualcommAMDからIPを買っているだけあって、SDKの品質もそれなりに高い。1パッケージのSDKには、DirectXや他の開発環境のようなサンプル/ツールブラウザも付いてくる。
SDKにはp2pやARのためのライブラリ等も含まれている。
APIエミュレータOpenGL ES 3.0もサポートしていて、GPUメモリ制限などのデバッグ機能も有る。また、実機同様のシェーダパーサが統合されているので、シェーダのエラーチェックも行える。
Adrenoは(PowerVRと並んで)ザ・最適化が面倒なGPUなのでそれなりに戦う必要が有る。それを見越してのSDKの充実のような気もする。。
Snapdragon向けのclangベースコンパイラもβ版ながら提供している。

ARM

短いURLは気合の現れ。。ARMは独立系GPU IPベンダFalanxを買収して得たMaliを基軸に自社のCPU IPビジネスを補完している。
SDKにもかなりコストを掛けているようで、品質は高い。
パフォーマンスアナライザのMali Graphics Debuggerや、シェーダ開発環境はEclipseベース。CPU側のアナライザは別パッケージで提供されている(ARM DS-5)。プロファイリングには.soのinjectが必要。
ドキュメントも解析の心意気から多少のアーキテクチャ説明までカバーする充実。

nVidia

Tegraは基本的にAndroid以外のdesign winが無いので、Android development pack一つで事足りる。Android development packは、Visual Studioに対応したコンパイラ、デバッガも含んでいるのが大きな特徴で、PC向けの開発環境(Nsight)などで長いこと統合開発環境をサポートしてきたnVidiaらしい着眼点に見える。
nVidiaはShieldのようなコントローラ一体型デバイスも売っているので、ゲーム開発者にはコントローラのサポートを推奨するなど細かい戦略も垣間見える。
nVidiaはモバイルGPUベンダの中で唯一オフラインコンパイラを提供していない。
nVidiaのパフォーマンスアナライザ(PerfHUD)は、Android 4.0以降のハードならstockファームウェアでそのまま使用できる。また、CPUプロファイラやコンパイラも統合している。

Vivante

VivanteはベンダとしてはGPU SDKを直接提供していない。うーむ。。まぁVivanteのGPUはある意味"ギリギリGPU"で、Unifiedシェーダと言いつつピクセルシェーダ256命令/バーテックスシェーダ256命令で固定分割といった男らしい単純化が光るアーキテクチャなので(最近のIPは違うかもしれない)。。個人的には気になるGPUだけど、如何せん他のメジャープレイヤに比べるとあまりDesign winが無い。
VivanteのSDKは、Freescaleがi.MX6のGPU SDKとして配布している(Vivante_VDK-v1.4.5.zip)。Freescaleのダウンロードで、"vivante"で検索すると入手できる。OpenGL ESやOpenCL(!)のAPIエミュレータを含んでいるが、API横流しするだけでデバッグ用の機能等はあまり充実していない。
オフラインシェーダコンパイラやシェーダのエディタも有るが、シェーダの静的解析機能(メモリ消費量等)が存在しないので、シェーダ長溢れの検出くらいにしか使えない。
パフォーマンスアナライザ(vAnalyzer)の使用にはカーネルパッチの適用と再コンパイルが必要。カーネルパッチはFreescaleから提供されている。
ドキュメントも殆どない。Freescaleが幾つかFAQを公開している程度。
ちなみに、GUIツールのツールキットはwxWidgetsまぁIntelのVTuneもwxWidgetsですし。。

GPU SDKの今後

Androidのプラットフォームはよくも悪くも多様性があるので、GPU SDKを統合するためのよい方法がなかなか無い。レンダリング方法をとっても各社のGPUに2つと同じものが無く、タイルベースであることくらいしか共通点が無い。
↑のCEDECの記事のように、GPU毎にパフォーマンスの傾向は異なる。しかし、GPU毎に異なるレンダリングテクニックを使用するとQAのコストも高くなってしまうので、エフェクトやフレームレートの調整程度になってしまう。
iOSPowerVRを継続して採用していて、各社のゲーム専用機も一定のGPUを採用しているので開発環境にそれなりのGPU SDKが統合されているのが普通のスタイルになっている。このポイントがAndroidと他の垂直統合プラットフォームを大きく分けている。
力の強いベンダ、nVidiaやARMは自社のGPU向けに最適化するための方法をかなりオープンに公開している。これらのベンダのGPU SDKはこれからもリッチになり続けるだろう。
しかし、VivanteやDMP、TakumiのようなGPU専業ベンダこそ、自社GPU IPに向けた最適化支援を熱心に提供すべきだと思う。コミュニティサポートの無いGPUは今後SoCベンダから敬遠されるようになっていくのではないだろうか。もちろん、OpenSolarisがあまり大きく状況を変えなかったように、オープン化が全てを上向かせるわけではないが。。
GPU専業ベンダが生き残れるかどうかは微妙なポイントといえる。現状、モバイルCPUコアはARMほぼ一択となっているので、CPUアーキテクチャが多い状況よりは生き残りやすいとも言えるが、それでも、市場シェアを考えるとCPU+GPUの両IPを確保できるベンダが強いのは変わらないだろう。IMGにAppleのような強力なDesign winがある以外は、メジャープレイヤは全て自前のCPUコアも持っている。CPUコアに対してもSDKを提供するモチベーションはあるため、今後はGPUとの統合エコシステムを構成するSDKとして立ち位置が変化していくだろう。そういう意味では、nVidiaのようなone stopなpackを提供する方向に他のベンダも行くのではないかと思う。