日別アーカイブ: 2011年9月11日

OpenGL ES 2.0 shader の演算精度

OpenGL ES 2.0 の GLSL では演算精度の宣言ができます。

宣言       fp精度        vsh     fsh
---------------------------------------
highp      24bit 以上    必須    option
mediump    16bit 以上            必須
lowp       10bit 以上

それぞれ最低限の演算精度が決まっていますが上限はありません。
GPU によっては lowp 宣言しても常に highp とみなされることもあります。
検証プログラムを作って調べてみました。

                         vertex shader         fragment shader
------------------------------------------------------------------
Adreno 200/205           highp                 highp
PowerVR SGX 535/540      highp/mediump/lowp    highp/mediump/lowp  
Tegra 250 (ULP GeForce)  highp/mediump/lowp    highp/mediump/lowp
Mali-400MP               highp                 mediump

変数宣言時の精度修飾子によって演算結果と動作速度が変わるのは
PowerVR と Tegra2 です。

精度を下げると速度が向上する理由としては

・純粋に演算ユニットの能力が不足していたため
・テンポラリレジスタの消費が減ってスレッド並列性が上がるため

の 2つが考えられます。

precision 宣言の影響が全く無いのは Adreno と Mail-400 です。
特に Adreno は Unified shader であり fragment も vertex 同様
highp で演算が行われています。

同じように Mali-400 も固定精度ですが fragment の演算精度は mediump
相当でした。

こちらにまとめています
Mobile GPU の比較

本当は仮数部の bit 数まで厳密に求めようとしたのですがコンパイラの違いか
最適化のためかうまくいきませんでした。

関連エントリ
Android Galaxy S2 ARM Mali-400 MP
iPad2 A5 と浮動小数点演算 VFP/NEON
Android OpenGL ES 2.0 の圧縮テクスチャ
Tegra2 Cortex-A9 と浮動小数点演算
Snapdragon と浮動小数点演算速度