Loop- Abrollung (manchmal auch Loop-Abrollung ) ist eine Optimierungsmethode , die es ermöglicht, die Laufzeit eines Computer- Programms die Größe seiner Programmdaten zu berechnen . [1] Dabei wird eine Schleife
-
- Entwird durch eine äquivalenzte Schleife ersetzt, die mehr Kope des Schleifenrumpfes enthält und eine kleine Anzahl an Durchläusen hat,
- oder aber du bist willkommen, weil du viel Ärger hast, wer ursprünglich anrufe Durchläufe war.
Drückt die Schleifenbedingung seltener oder gar nicht mehr überprüft. Es wird oft möglich sein, anschliessend weitere Optimierungen des Schleifenrumpfes durchzufuhren. Die Anzahl der Kopie des Ursprünglichen Schleifenrumpfes Wird Abrollfaktor ( englisch entrollen Faktor ) genannt. [2] [3]
Modern Compiler Versuchen Sie Schleifen automatisch zu fallen, fällt auf Geschwindigkeit optimiert werden soll. [4] [5] Ist gestanden, dass die Architektur ein Programm weiter ausgeführt wird, kann eine manuelle Optimierung sogar über sein. [6]
Idee
Die Ursprünge des Loop Abrolling War, das Verhältnis von Schleifenrumpf zu Schleifenkontrollvorschriften, zu optimieren. [7] Bei heute Prozessor Komplex Mechanismus zur Optimierung des Programmflusses BESITZ (z. B. Sprungvorhersage und Pipelining ), Kann der entrollte Schleifenrumpf noch weiter optimiert Werden.
Ansatz
Bei einer Schleife muss jeder durchlauf de sog. Schleifenbedingung wird geprüft, wenn ein weiterer Durchlauf stattfindet. Bei diesem kleinen Gerät kann man einen großen Teil der Laufzeit einstellen.
für ( i = 0 ; i < 8 ; i = i + 1 ) dest [ i ] = src [ i ];
Eine Schleife ist nur aus den folgenden Anweisungen: Kopieren, Erhöhnen des Zählers, Prüfen der Bedinung und ggf. einer sprang. Somit bringt den Prozessor etwa de Häfte der Zeit nur mit Kontrollanweisungen. [7]
Eine naheliegende Optimierung ist es, stirbt Schleife Durch n Kopieren Ihres Schleifenkörper zu ersetzen ( Vollständiges Entrollen ). Schleifenkontrollanweisungen und zzthler entfallen dann ganz:
dest [ 0 ] = src [ 0 ]; dest [ 1 ] = src [ 1 ]; dest [ 2 ] = src [ 2 ]; dest [ 3 ] = src [ 3 ]; dest [ 4 ] = src [ 4 ]; dest [ 5 ] = src [ 5 ]; dest [ 6 ] = src [ 6 ]; dest [ 7 ] = src [ 7 ];
Teilweisen Entrollen
Wenn ein vollständiges Entriegeln möglich ist, können Sie dies auch tun ( teilweise Entrollen ). Draußen sank die Anzahl der auszuführenden Kontrollanweisungen.
Es wird der ursprüngliche Schleifenrumpf durch eine weitere Schleife ersetzt, die durch die Abrollfaktorentpreches (hier: 2):
für ( i = 0 ; i < 8 ; i = i + 2 ) { für ( j = 0 ; j < 2 ; j = j + 1 ) dest [ i + j ] = src [ i + j ]; }
Anschliessen wird die innere Schleife komplett
für ( i = 0 ; i < 8 ; i = i + 2 ) { dest [ i ] = src [ i ]; dest [ i + 1 ] = src [ i + 1 ]; }
Einige teilweisen Entrollen können verwöhnt werden, wenn
- Die Anzahl der Schleifendurchläufe bei der Übersetzung oder Nicht bekannt ist (siehe hier auch Duff’s Device ),
- Der Schleifenrumpf zu der Anzahl der Iterationen zu hoch ist, dh der zu große Maschinencode zu groß wäre.
Verschnitt
Dabei ist die Möglichkeit gegeben, die Anzahl der möglichen Iterationen nicht zu überschreiten. Es verblaßt dann einen Rest Ein Teil der Schleife der Schleife kontrolliert, wer gesünder behandelt hat, wurde Muss.
Beispiel: Die Anzahl der Durchläufe ergebe sich erst zur Laufzeit, sterben Ursprüngliche Schleife Seelachs 10-Fach entrollt Worden (d H. Wo Ursprüngliche Schleifenkörper STEHT 10 Vorlage im neuen Schleifenkörper.). Zur Laufzeit Ergibt sich that 1005 Iteration berechnet Werden Sollen, auch 100 Durchläufe, sterben 10-fach Rechner – bleibt (in diesem Programmlauf) ein Übriges von 5 Wiederholungen.
Es könnten nun folgende Maßnahmen ergriffen werden:
- The rest complete entroll, so bald zum Übersetzungszeitpunkt, dass eine Anzahl der Schleifendurchläufe bekannt ist,
- Der Rest in Einer besitzt Schleife Einzel Verarbeiten (wer in der Entstehung von Schleife),
- Der Teilnehmer Schleifenrumpf nur teilweise ausführen (siehe Duff’s Device )
- Wer Prostituierte ist, greift auf ein umfassendes Vielfaches der Inneren Schleife auf.
Vorteile
- Weniger ausführende Befehle: [8] : Durch den Wegfall bzw. die verschiedenen Ausführungen der Kontrollvorschriften wird die Ausführungszeit bestätigt.
- Geprüfte Registersuche : Der Schleifenzähler muss besser oder besser in einem Register sein . Vielen Dank für weitere Berechnungen zur Verfügung.
- Latenzverdeckung ( englisch „Latency Versteck“ ) Tritt Einer Verzögerung Durch zugriff Auf einer langsameren Speicher auf, Kann das nächste (entrollte) durchlauf begonnen oder Sogara parallel abgearbeitet Werden ( Pipelining ).
- Entfernte von Gemeinsam verwendeten – Code ( englisch „common subexpression Elimination“ ) mehrfach Berechnungen des Gleiche Wert Konnen Entfernt Werden.
- Vektorisierung : Die Aufrufe können vektorisiert werden, dh Hhrmehrere Bereicierungen können innerhalb des Befehlsfensters zusammengefasst werden (z. B. von SSE ).
- Optimierter Speicherzugriff: Speicherzugriffe can so umgeordnet Werden that sich die Prefetching Prozessor oder Dezember Write-Through Dezember Caches besser berücksichtigen.
Nachteile
- Manuelles Entrollen unterscheidet sich von der Lesbarkeit des Quelltextes.
- Die Größe des Programms wäscht wie die Anzahl der Instruktoren. Es gibt viele Dinge zu tun, die eine Wahrscheinlichkeit sind, die aus dem Befehlscache verdrängt wurde und den langfristigen Nachladen den Geschwindigkeitswert kompensiert.
- Evtl. Könnten nicht alle von der Schleife benützen Variablen in der Registrierung werden gespeichert, bijzondere bei architecten wie z. B. x86 . Dann muss auf den Hauptspeicher (oder Prozessorcache) hinauswachsen werden. [6]
Manuelles Abroll
Wann ist ein manuelles Abrollen besser als das? Automatische Compiler-Optimierung ist möglich. Im Zweifelsfall müssen Laufzeitenmessungen vorgenommen werden.
Allgemeingültig, die automatische Optimierung wird
- dein Schreiber, wer Schleife ist (komplexe Berechnungen, viele Dates, innere Schleifen, aufgegebene Anzahl an Durchläufen),
- Wenn es um Kontrollfragen geht
- wenn (teilweise) rekursive Berechnungen durchgeführt werden (Datenflussabhängigkeiten).
Beispiel
Ein einfaches beispiel, bei ihnen es heute nicht Compilern gelingt, sterben Schleife automatically zu entrollen, ist: [9]
Doppel sum = 0,0 ; für ( int in = 0 ; in < n ; ++ in ) für ( int j = 0 ; j < n ; ++ j ) sum + = x [ in ] [ j ] * ( der * in + j * j ) ;
Deshalb gibt es einen Faktor (in 2 + 2 ), so dass man es als auch vom inneren schleifenindex abhängt sehen kann. Von Hand lässt sich diese Schleife problemlos entrollen.
Siehe auch
- Duffs Gerät
Weblinks
- 64 Intel und IA-32 Architektur Software Developer Manuals , Intel 64 und IA-32 Architektur Software Developer Benutzerhandbuch Combined Volumes: 1, 2A, 2B, 2C, 3A, 3B und 3C (PDF; 15,4 MB)
- AMD Developer Central: Entwicklerhandbücher und Handbücher , Software-Optimierungshandbuch für 15- MHz- Prozessoren der AMD-Familie (PDF; 2.0MB)
- Kapitel 7, S. 8-10. (PDF, 2,2 MB), Michael Abrashs Graphics Programming Black Book mit One Loop Unrolling Beispiel in x86 Assembler (Englisch)
- Subroutinen in Assemblersprache optimieren (PDF; 873 KB) Agner Fogs Optimierungshandbuch ua mit der Loop entrolling -Technik (englisch, 2012)
Einzelstunden
- Hochspringen↑ Jeffrey D. Ullman, Alfred V. Aho: Grundlagen des Compilerdesigns. Addison Wesley, 1977, ISBN 0-201-10073-8 .
- Hochspringen↑ Steven S. Muchnick: Fortgeschrittener Compiler Design & Implementierung. Morgan Kaufmann Publishers, 1997, ISBN 1-55860-320-4 .
- Hochspringen↑ Intel 64 und IA-32 Architectures Optimization Reference Manual
- Hochspringen↑ Intel C ++ – Compiler XE 13.0 Benutzer- und Referenzhandbücher: O
- Hochspringen↑ GCC 4.7.2 Handbuch: Optimierungsmöglichkeiten
- ↑ Hochspringen nach:a b Mike Wall: Verwenden von Block Prefetch für optimierte Speicherleistung. mit.edu , 19. März 2002; abgeraufen am 22. September 2012 (pdf; 136 kB, englisch).
- ↑ Hochspringen nach:a b Tom Duff auf Duff’s Gerät auf www.lysator.liu.se ( englisch )
- Hochspringen↑ Agner Fog: Optimieren von Unterprogrammen in Assembler. Technische Universität Kopenhagen, 29. Februar 2012, S. 100 ; abgeraufen am 22. September 2012 (PDF; 873 KB, englisch): „12.11 Loop Unrolling“
- Hochspringen↑ Stefan Goedecker, Adolfy Hoisie: Leistungsoptimierung von Numerisch Intensive Codes . SIAM, 2001, ISBN 978-0-89871-484-5 , S. 59.