最適化オプションを使ってGLSLのshaderを高速化する

nVidiaOpenGLドライバは、シェーダのソースコード中に #pragma を埋め込むことで、GLSLのコンパイラの最適化処理を制御できます。

公式なドキュメントが見つからないのですが、#pragma では以下のオプションが使えるようです

#pragma optionNV(inline all)
#pragma optionNV(fastmath on)
#pragma optionNV(fastprecision on)
#pragma optionNV(ifcvt none)
#pragma optionNV(strict on)
#pragma optionNV(unroll all)

機能的には

  • inline は関数のインライン展開の制御
  • fastmath (調査中。おそらく gcc の fastmath と同義 )
  • fastprecision 倍精度、単精度の切り替え
  • ifcvt (調査中。おそらくx86 でいう cmov をつかうか否か)
  • strict (調査中)
  • unroll 繰り返し処理の展開による最適化のOn/Off

とう雰囲気です

公式ドキュメントが見つからないので断言は出来ませんが、調べた限りでは nVidiaコンパイラは、デフォルトでは関数のインライン展開を行わないようです。

手元のシェーダは

#pragma optionNV(inline all)

をつけるだけで、フレームレートが20%程向上しました