Poor shader optimination in PRMan

by syoyo

あまり使うことはないと思いますが、
以下のような、何もしないけど重いループが PRMan ではコンパイル時の最適化で除去されません(-O2 をつけてコンパイルしたとしても).
(このシェーダを使うと、レンダリングに時間がかかる)


surface
myloop()
{
  float i;
  for (i = 0; i < 100000; i += 1) {
  }
}

一方、3Delight(-O3 オプション有効)はこのループを除去します.
よってこのシェーダを使ったレンダリングは一瞬で終わります.

次に、以下のような Ci にいろいろ代入するけれども、最後の Ci 代入だけが効果がある例.


surface
myshader()
{
    float i0 = 0.0;
    Ci = i0;
    float i1 = 1.0;
    Ci = i1;
    ...
    float i10000 = 10000.0;
    Ci = i10000;
}

Ci = i10000 の expression 以外は DCE(Dead Code Elimination) されることが期待されます.

PRman だとシェーディング処理がそこそこかかります(DCE されていない).
3Delight(-O3 最適化オプション有効)だと一瞬でした(DCE されているようだ)

んー、PRMan のシェーダコンパイラ(やインタプリタ)は、あまり最適化してくれないようですね.

Advertisements