私の仮定では、GLSLコンパイラーはすべての関数呼び出しを単純にインライン化し、それらを安価にします。ただし、GLSLで実装されたスタックフレームなどの関数呼び出しの場合、非常にコストがかかる可能性があります。GLSL関数呼び出しがまったく費用がかかるかどうか誰かが知っていますか?
2 に答える
一般に、関数呼び出しは、スタックフレームなどが存在しないため(GLSLでは再帰がないため)、インライン化されていない場合でも安価である必要があります。したがって、関数呼び出しは、どのアーキテクチャーでも(おそらく1〜2サイクル)オーバーヘッドを禁止するものであってはなりません。
if(foo) bar(); else baz();
ただし、関数呼び出しは、たとえば、ワークグループ内のブランチが分岐している場合(つまり、すべてのスレッドがまったく同じパスをとるわけではない場合)、GPUで非常にコストがかかる条件付きブランチのコンテキストで発生することがよくあります。
単一のスレッドだけがかかる場合、または可能性がある場合ワークグループ内の別のパスを使用する場合、GPUは両方のパスを実行してから条件付き移動を実行するか(前世代のハードウェアでは通常の場合)、同期ポイントを(暗黙的に)最新世代のハードウェアに挿入する必要があります。この場合、取得されたパスのみが各スレッドによって評価されますが(これにより、おそらくある程度の電力が節約されます)、事実上すべてのスレッドがロックステップを実行し、短いパスは長いパスとまったく同じ長さになります。別の言い方をすれば、ワークグループ内のすべてのピクセル(または頂点、または作業項目)は、グループ内で最も遅いピクセルと同じ速さで処理されます。
関数呼び出しは、デバイスによっては高価になる可能性があります。Aras (Unity から) による GLSL オプティマイザをご覧になることをお勧めします。