Wie kann ich GCC sagen, eine bestimmte Schleife abzurollen? Ich habe das CUDA SDK verwendet, wo Schleifen manuell unter Verwendung #pragma unroll
entrollt werden können. Gibt es eine ähnliche Funktion für gcc? Ich habe ein wenig gegoogelt, konnte aber nichts finden.Erlaube gcc, eine Schleife speziell zu entrollen
Antwort
GCC Sie ein paar verschiedene Möglichkeiten der Handhabung ergibt dies:
Verwendung #pragma Richtlinien, wie
#pragma GCC optimize ("string"...)
, wie man sehen in der GCC docs. Beachten Sie, dass das Pragma die Optimierungen global für die restlichen Funktionen vornimmt. Wenn Sie#pragma push_options
undpop_options
Makros geschickt, könnte man wahrscheinlich diese um definieren nur eine Funktion wie folgt:#pragma GCC push_options #pragma GCC optimize ("unroll-loops") //add 5 to each element of the int array. void add5(int a[20]) { int i = 19; for(; i > 0; i--) { a[i] += 5; } } #pragma GCC pop_options
Beschriften einzelnen Funktionen mit GCC Attribut Syntax: überprüfen Sie die GCC function attribute docs für eine ausführlichere Dissertation über die Gegenstand. Ein Beispiel:
//add 5 to each element of the int array. __attribute__((optimize("unroll-loops"))) void add5(int a[20]) { int i = 19; for(; i > 0; i--) { a[i] += 5; } }
Hinweis: Ich bin nicht sicher, wie gut GCC ist bei Abrollen Reverse-iterativ Schleifen (ich habe es Abschriften zu bekommen mit meinem Code schön zu spielen). Die Beispiele sollten jedoch gut kompiliert werden.
Sehr cool, dass es ein Funktionsattribut dafür gibt, es wird jedoch von Apples neuestem GCC für iOS ignoriert: "Warnung: 'optimieren' Attribut-Direktive ignoriert". (Ich weiß, dass sie auf LLVM umgestiegen sind, aber ich benutze immer noch GCC, da es manchmal schnelleren Code produziert.) Wer weiß, warum es ignoriert wird? Ist Apples GCC-Zweig zu alt? Nebenbei, in der Funktion, in der ich es benutzt habe, werden Loops sowieso ausgerollt, solange ich -O3 benutze. – Simplex
Ich habe gerade '__attribut __ ((optimize (" unroll-loops "))) mit etwas eingebettetem Code versucht und es hat die Geschwindigkeit um nur 3% verbessert. Manuelles Abrollen um das Achtfache verbesserte die Geschwindigkeit um 12% und erhöhte die Programmgröße nicht so sehr. – endolith
Mein GCC sagt Warnung: Ignorieren #pragma optimieren ... Ist das immer verfügbar? – neodelphi
-funroll-loops
kann hilfreich sein (obwohl es Loop-Unrolling global aktiviert, nicht pro Schleife). Ich bin nicht sicher, ob es eine #pragma
ist das gleiche zu tun ...
ich habe das auch gefunden, aber ich möchte nur eine bestimmte Schleife ausrollen – Nils
bmei von broadcom haben eine Reihe von Patches um die "#pragma entroll" Unterstützung für gcc hinzuzufügen. – osgx
@Jerry Coffin, wie kann ich es benutzen? Können Sie mir einen Befehl geben, der -funroll-loop verwendet? –
- 1. Javascript: Wie erlaube ich einer Schleife, eine ID zu ändern?
- 2. GCC: Erlaube überladene Funktionen in C99
- 3. Strong Params + Rails4 - Wie erlaube ich nicht speziell?
- 4. Wie gcc Flags (CXXFLAGS) speziell für ein bestimmtes Modul angeben?
- 5. eine Funktion erlaube
- 6. Erlaube nur eine Anwendungsinstanz
- 7. Python 3: Entrollen Argumente von Tupel
- 8. Wie funktioniert die `for` Schleife an Wörterbüchern speziell
- 9. Erlaube einer beliebigen Webseite eine Verbindung zu Chrome APP herzustellen.
- 10. Erlaube, dass Vorlagen abgeleitet werden
- 11. VOIP in eine Anwendung einbauen (speziell C++)
- 12. Benutzerdefinierte Winforms-Steuerelemente (eine Schaltfläche speziell)
- 13. Erlaube help() an Teilfunktionsobjekt zu arbeiten
- 14. Erlaube nur iframe Inhalt zu laden
- 15. Erlaube Benutzern, Expander in WPF zu ändern
- 16. Erlaube "Shop Manager" Benutzerkonto zu löschen
- 17. Hat GCC eine GUI?
- 18. Ist MarshalByRefObject speziell?
- 19. Import Namespace-Klasse speziell
- 20. Spring MVC Erlaube Header
- 21. Django - Erlaube doppelte Benutzernamen
- 22. Eine Schleife in einer Schleife, um ein Array zu füllen?
- 23. Nginx - Erlaube Herkunft IP
- 24. Fähigkeiten zu lernen, Altersdiskriminierung zu vermeiden (speziell .net)
- 25. Erlaube Außentemperatur für DialogFragment
- 26. Erlaube Sternchen in URL
- 27. gcc -Whadow ist zu streng?
- 28. Migrieren von g ++ zu gcc
- 29. GCC nicht 'Pragma GCC-Diagnose' zu Schweigen Warnungen
- 30. Gebräu installiert gcc zu zeitaufwändig
Ich kann nicht glauben, dass ich das sagen werde. Wenn du nichts anderes findest, gibt es immer ... Duffs Gerät. Nun, wo * habe * ich die Peitsche des Peinigers gemacht? Ich kenne es hier irgendwo ... – dmckee
Heh kannst du es mit Makros machen? Wahrscheinlich nicht, also ist es das Einzige, was übrig geblieben ist? – Nils
In aller Ernsthaftigkeit würde ich vorschlagen, die separate Kompilation genau dieses Bits mit '-Funktions-Loops' zu untersuchen, bevor du Duff's Device benutzt: es ist eine schöne Sache zu studieren, aber eine hässliche Sache in deinem Code. – dmckee