Shader-Compiler sind äußerst aggressiv beim Abrollen, da frühe HW häufig keine Flusskontrolle hatten und die Kosten für neuere HW variieren können. Wenn Sie einen Benchmark haben, gegen den Sie aktiv testen, und eine Reihe relevanter Hardware, versuchen Sie Dinge, um zu sehen, was passiert. Ihre dynamische Schleife ist für Entwicklerinterventionen besser geeignet als eine statische Schleife. Es ist jedoch immer noch ein guter Rat, sie dem Compiler zu überlassen, es sei denn, Sie haben einen Benchmark zur Verfügung. Mit einem Benchmark lohnt sich die Erkundung (und macht Spaß).
Übrigens ist der größte Verlust bei einer dynamischen Schleife auf einer GPU, dass einzelne "Threads" in einer Wellenfront / einem Warp zu unterschiedlichen Zeiten beendet werden. Die Threads, die später gestoppt werden, zwingen alle, die vorzeitig beendet werden, NOPs auszuführen.
Verschachtelte Schleifen sollten sorgfältig durchdacht werden: Ich habe einen blockbasierten Entropiedecoder implementiert, der Läufe von Nullen codiert (für JPEG-ähnliche Komprimierung). Die natürliche Implementierung bestand darin, die Läufe in einer engen inneren Schleife zu dekodieren - was bedeutete, dass oft nur ein Thread Fortschritte machte; Durch Abflachen der Schleife und explizites Testen in jedem Thread, ob gerade ein Lauf dekodiert wurde oder nicht, habe ich alle Threads durch die Schleife mit fester Länge aktiv gehalten (die dekodierten Blöcke hatten alle die gleiche Größe). Wenn die Threads wie CPU-Threads wären, wäre die Änderung schrecklich gewesen, aber auf der GPU, auf der ich lief, konnte ich die Leistung um das Sechsfache steigern (was immer noch schrecklich war - es gab nicht genügend Blöcke, um die GPU zu beschäftigen - aber es war ein Proof of Concept).