悲しいことに、AMDはこれをサポートしていないかもしれませんが、NVidia には素晴らしいプラグマ アンロール ディレクティブがあると思います。逆に困っている人はGLSLで「#pragma optionNV (unroll all)」で呼び出すのですが、以下のようにすれば展開が防げると思います。NVidia フォーラムでの DenisR の 2008 年の投稿を引用します。
デフォルトでは、コンパイラは既知のトリップ カウントで小さなループを展開します。ただし、#pragma unroll ディレクティブを使用して、特定のループの展開を制御できます。ループの直前に配置する必要があり、そのループにのみ適用されます。オプションで、ループをアンロールする必要がある回数を指定する数値が続きます。
たとえば、次のコード サンプルでは:
#pragma unroll 5
for (int i = 0; i < n; ++i)
ループは 5 回展開されます。アンロールがプログラムの正確性に影響を与えないことを確認するのは、プログラマーの責任です (上記の例では、n が 5 より小さい場合、影響を受ける可能性があります)。
#pragma unroll 1
コンパイラがループをアンロールしないようにします。
#pragma unroll の後に数値が指定されていない場合、トリップ カウントが一定であればループは完全に展開されます。それ以外の場合はまったく展開されません。
だから私はそれを想像するでしょう
#pragma optionNV (unroll 1)
GLSL (および WebGL?) で動作する可能性があります。(たとえば、StackOverflow の質問のselective-nvidia-pragma-optionnvunroll-allは、少なくとも一部のプラットフォームでは、これが GLSL で機能する可能性があることを暗示しているようです。)
近年、AMD が unrolling プラグマをサポートしている可能性があることを示唆しているようですが (GLSL ではサポートされていない可能性があります)、私は詳しくなく、試したこともありません: AMD OpenCL カーネルでのループの展開
(Chrome/Firefox で WebGL を介して GLSL を使用する場合、またはその他のシナリオでさえ、GLSL コンパイルがANGLEを介してパイプされる可能性があることに注意してください。これは、Windows の HLSL バックエンドにレンダリングされる可能性があります。私はこれについて非常に限られた理解しか持っておらず、ドン「情報を広めたくないので、絶対に引用しないでください。これまでにこの問題について収集した情報を共有する必要があると感じただけで、この回答を喜んで編集します (または、人々はこの回答を自由に編集する必要があります)。 ) より多くの確認された情報が利用可能になるにつれて. )