シェーダーコンパイラーは、初期のハードウェアにはフロー制御がなかったことが多く、最近のハードウェアのコストが変動する可能性があるため、アンロールについて非常に積極的です。積極的にテストしているベンチマークと関連するさまざまなハードウェアがある場合は、何が起こるかを確認してみてください。動的ループは、静的ループよりも開発者の介入の影響を受けやすくなりますが、ベンチマークを利用できる場合を除き、コンパイラーに任せることをお勧めします。ベンチマークがあれば、探索は価値があります(そして楽しい)。
ところで、GPUの動的ループによる最大の損失は、波面/ワープの個々の「スレッド」が異なる時間に終了することです。後で停止するスレッドは、早期に終了するすべてのスレッドにNOPの実行を強制します。
ネストされたループは注意深く検討する必要があります。ゼロのランをエンコードするブロックベースのエントロピーデコーダーを実装しました(JPEGのような圧縮の場合)。自然な実装は、タイトな内部ループで実行をデコードすることでした。これは、多くの場合、1つのスレッドのみが進行していたことを意味します。ループをフラット化し、実行を現在デコードしているかどうかを各スレッドで明示的にテストすることにより、固定長ループを通じてすべてのスレッドをアクティブに保ちました(デコードされたブロックはすべて同じサイズでした)。スレッドがCPUスレッドの場合、変更はひどいものでしたが、実行中のGPUでパフォーマンスが6倍になりました(それでもひどい-GPUをビジー状態に保つための十分なブロックがありませんでした-しかし、それは概念実証でした)。