Gibt es eine Möglichkeit zu sagen, Clang eine bestimmte Schleife ausrollen?clang: Force loop für spezifische Schleife ausrollen
Googeln für eine Antwort gibt mir Befehlszeilenoptionen, die die gesamte Kompilente und nicht eine einzige Schleife betreffen wird.
Es gibt eine ähnliche Frage für GCC --- Tell gcc to specifically unroll a loop --- aber die Antwort vorausgesetzt, es nicht mit Klirren funktioniert.
Option 1 vorgeschlagen dort:
#pragma GCC optimize ("unroll-loops")
scheint stillschweigend ignoriert zu werden. Tatsächlich
#pragma GCC akjhdfkjahsdkjfhskdfhd
wird auch still ignoriert.
Option 2:
__attribute__((optimize("unroll-loops")))
führt zu einer Warnung:
warning: unknown attribute 'optimize' ignored [-Wattributes]
aktualisieren
joshuanapoli bietet eine schöne Lösung, wie über Metaprogrammierung und C iterieren + +11 ohne eine Schleife zu erstellen. Das Konstrukt wird zur Kompilierungszeit aufgelöst, was zu einem wiederholt inlinierten Körper führt. Es ist zwar nicht genau eine Antwort auf die Frage, aber im Wesentlichen wird dasselbe erreicht.
Deshalb akzeptiere ich die Antwort. Wenn Sie jedoch wissen, wie Sie eine Standard-C-Schleife verwenden (for
, while
) und erzwingen Sie es ausrollen - bitte teilen Sie das Wissen mit uns!
Normalerweise hat der Compiler eine sehr gute Vorstellung davon, wann es geeignet ist, eine Schleife aufzurollen, und wenn es keine gute Idee ist.Was ist der Spezialfall, den Sie zu lösen versuchen, wo dies nicht zutrifft? –
Es kann nicht * zwingen * entrolling, aber '__attribute__ ((heiß))' könnte einen Versuch wert sein. –
@MatsPetersson Ich möchte explizit den Vorteil der Schleife Abrollung zu messen. Handgeschriebenes Unroll beschleunigt den Code 3 Mal, aber der Compiler erkennt es nicht. – CygnusX1