Loop unrolling
Loop unrolling (manchmal auch Loop unwinding), das {{#if:trim|„Strecken zyklischer Rechenpläne“<ref>{{#if:|{{#iferror: {{#iferror:{{#invoke:Vorlage:FormatDate|Execute}}|}}| |}}}}{{#if:Rutishauser, Heinz|Rutishauser, Heinz: }}{{#if:|{{#if:Automatische Rechenplanfertigung bei programmgesteuerten Rechenmaschinen|[{{#invoke:Vorlage:Internetquelle|archivURL|1={{#invoke:URLutil|getNormalized|1={{{archiv-url}}}}}}} {{#invoke:Vorlage:Internetquelle|TitelFormat|titel=Automatische Rechenplanfertigung bei programmgesteuerten Rechenmaschinen}}]{{#if:| ({{{format}}})}}{{#if:| {{{titelerg}}}{{#invoke:Vorlage:Internetquelle|Endpunkt|titel={{{titelerg}}}}}}}}}|{{#if:https://archive.computerhistory.org/resources/text/Knuth_Don_X4100/PDF_index/k-5-pdf/k-5-u2456-Rechenplanfortigung-german.pdf%7C{{#if:{{#invoke:TemplUtl%7Cfaculty%7C}}%7C{{#invoke:Vorlage:Internetquelle%7CTitelFormat%7Ctitel={{#invoke:WLink%7CgetEscapedTitle%7C1=Automatische Rechenplanfertigung bei programmgesteuerten Rechenmaschinen}}}}|[{{#invoke:URLutil|getNormalized|1=https://archive.computerhistory.org/resources/text/Knuth_Don_X4100/PDF_index/k-5-pdf/k-5-u2456-Rechenplanfortigung-german.pdf}} {{#invoke:Vorlage:Internetquelle|TitelFormat|titel={{#invoke:WLink|getEscapedTitle|1=Automatische Rechenplanfertigung bei programmgesteuerten Rechenmaschinen}}}}]}}{{#if:| ({{{format}}}{{#if:Mitteilungen aus dem Institut für angewandte Mathematik an der ETH ZürichBirkhäuser1961{{#if: 2019-01-06 | {{#if:{{#invoke:TemplUtl|faculty|}}||1}}}}
| )
| {{#if:{{#ifeq:de|de||{{#if:de|1}}}}| ;
| )}}}}}}{{#if:| {{{titelerg}}}{{#invoke:Vorlage:Internetquelle|Endpunkt|titel={{{titelerg}}}}}}}}}}}{{#if:https://archive.computerhistory.org/resources/text/Knuth_Don_X4100/PDF_index/k-5-pdf/k-5-u2456-Rechenplanfortigung-german.pdf%7C{{#if:{{#invoke:URLutil%7CisResourceURL%7C1=https://archive.computerhistory.org/resources/text/Knuth_Don_X4100/PDF_index/k-5-pdf/k-5-u2456-Rechenplanfortigung-german.pdf}}%7C%7C}}}}{{#if:Automatische Rechenplanfertigung bei programmgesteuerten Rechenmaschinen|{{#if:{{#invoke:WLink|isValidLinktext|1=Automatische Rechenplanfertigung bei programmgesteuerten Rechenmaschinen|lines=0}}||}}}}{{#if: Mitteilungen aus dem Institut für angewandte Mathematik an der ETH Zürich| In: {{#invoke:Vorlage:Internetquelle|TitelFormat|titel=Mitteilungen aus dem Institut für angewandte Mathematik an der ETH Zürich}}}}{{#if: Birkhäuser| Birkhäuser{{#if: 1961|,|{{#if: 2019-01-06 | {{#if:{{#invoke:TemplUtl|faculty|}}||,}}}}}}}}{{#if: 1961| {{#if:{{#invoke:DateTime|format|1961|noerror=1}}
|{{#invoke:DateTime|format|1961|T._Monat JJJJ}}
|{{#invoke:TemplUtl|failure|1=Fehler bei Vorlage:Internetquelle, datum=1961|class=Zitationswartung}} }}{{#if: |,|{{#if: 2019-01-06 | {{#if:{{#invoke:TemplUtl|faculty|}}||,}}}}}}}}{{#if: | S. {{{seiten}}}{{#if: |,|{{#if: 2019-01-06 | {{#if:{{#invoke:TemplUtl|faculty|}}||,}}}}}}}}{{#if: {{#invoke:TemplUtl|faculty|}}| {{#if:1961Birkhäuser|{{#if:|archiviert|ehemals}}|{{#if:|Archiviert|Ehemals}}}} {{#if:|vom|im}} Vorlage:Referrer{{#if:{{#invoke:TemplUtl|faculty|}}| (nicht mehr online verfügbar)}}{{#if: | am {{#iferror: {{#iferror:{{#invoke:Vorlage:FormatDate|Execute}}|}}|{{{archiv-datum}}}{{#if:2049881||(?)}}}}}}{{#if: 2019-01-06|;}}}}{{#if: 2019-01-06| {{#if:1961Birkhäuser{{#invoke:TemplUtl|faculty|}}|abgerufen|Abgerufen}} {{#switch: {{#invoke:Str|len| {{#invoke:DateTime|format| 2019-01-06 |ISO|noerror=1}} }}
|4=im Jahr
|7=im
|10=am
|#default={{#invoke:TemplUtl|failure|1=Fehler bei Vorlage:Internetquelle, abruf=2019-01-06|class=Zitationswartung}} }} {{#invoke:DateTime|format|2019-01-06|T._Monat JJJJ}}
| {{#invoke:TemplUtl|failure|1=Vorlage:Internetquelle | abruf=2026-MM-TT ist Pflichtparameter}} }}{{#if:{{#ifeq:de|de||{{#if:de|1}}}}|{{#if:Mitteilungen aus dem Institut für angewandte Mathematik an der ETH ZürichBirkhäuser1961{{#if: 2019-01-06 | {{#if:{{#invoke:TemplUtl|faculty|}}||1}}}}
| (
| {{#if: | | (}}
}}{{#ifeq:{{#if:de|de|de}}|de||
{{#invoke:Multilingual|format|de|slang=!|split=[%s,]+|shift=m|separator=, }}}}{{#if: |{{#ifeq:{{#if:de|de|de}}|de||, }}{{{kommentar}}}}})}}{{#if: 1961{{#if: 2019-01-06 | {{#if:{{#invoke:TemplUtl|faculty|}}||1}} }}de|{{#if: |: {{
#if:
| „{{
#ifeq: {{#if:{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|de}} | de
| Vorlage:Str trim
| {{#invoke:Vorlage:lang|flat}}
}}“
| {{#ifeq: {{#if:{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|de}} | de
| „Vorlage:Str trim“
| {{#invoke:Text|quote
|1={{#if:
| {{#invoke:Vorlage:lang|flat}}
| {{#invoke:Vorlage:lang|flat}} }}
|2={{#if: {{#invoke:TemplUtl|faculty|}}|de-CH|de}}
|3=1}} }}
}}{{#if:
| (<templatestyles src="Person/styles.css" />{{#if: | : }}{{#if: | , deutsch: „“ }})
| {{#if:
| ({{#if: | , deutsch: „“ }})
| {{#if: | (deutsch: „“) }}
}}
}}{{#if: {{{zitat}}}
| {{#if:
| {{#if: {{{zitat}}}
| Vorlage:": Text= und 1= gleichzeitig, bzw. Pipe zu viel }} }}
| Vorlage:": Text= fehlt }}{{#if: | {{#if: {{#invoke:Text|unstrip|{{{ref}}}}}
| Vorlage:": Ungültiger Wert: ref=
| {{{ref}}} }}
}}|.{{#if:{{#invoke:TemplUtl|faculty|}}|{{#if:||{{#ifeq: | JaKeinHinweis |{{#switch:
|0|=Vorlage:Toter Link/Core{{#if: https://archive.computerhistory.org/resources/text/Knuth_Don_X4100/PDF_index/k-5-pdf/k-5-u2456-Rechenplanfortigung-german.pdf | {{#if: | [1] }} (Seite {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. Suche im Internet Archive ){{#if: | {{#if: deadurlausgeblendet | | Vorlage:Toter Link/archivebot }} }} | (Seite {{#switch:|no|0|=|#default=dauerhaft }}nicht mehr abrufbar{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}.) }}{{#switch: |no|0|= |#default={{#if: || }} }}{{#invoke:TemplatePar|check |opt = inline= url= text= datum= date= archivebot= bot= botlauf= fix-attempted= checked= |cat = Wikipedia:Vorlagenfehler/Vorlage:Toter Link |errNS = 0 |template = Vorlage:Toter Link |format = |preview = 1 }}{{#if: https://archive.computerhistory.org/resources/text/Knuth_Don_X4100/PDF_index/k-5-pdf/k-5-u2456-Rechenplanfortigung-german.pdf | {{#if:{{#invoke:URLutil|isWebURL|https://archive.computerhistory.org/resources/text/Knuth_Don_X4100/PDF_index/k-5-pdf/k-5-u2456-Rechenplanfortigung-german.pdf}} || {{#if: || }} }} | {{#if: | {{#if: || }} | {{#if: || }} }} }}{{#if: | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}} || {{#if: || }} }} }}{{#switch: deadurl |checked|deadurl|= |#default= {{#if: || }} }}|#default= https://wiki-de.moshellshocker.dns64.de/index.php?title=Wikipedia:Defekte_Weblinks&dwl=https://archive.computerhistory.org/resources/text/Knuth_Don_X4100/PDF_index/k-5-pdf/k-5-u2456-Rechenplanfortigung-german.pdf Die nachstehende Seite ist {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar]{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. (Suche im Internet Archive. ) {{#if: | {{#if: deadurlausgeblendet | | Vorlage:Toter Link/archivebot }} }}Vorlage:Toter Link/Core{{#switch: |no|0|= |#default= {{#if: || }} }}{{#invoke:TemplatePar|check |all = inline= url= |opt = datum= date= archivebot= bot= botlauf= fix-attempted= checked= |cat = Wikipedia:Vorlagenfehler/Vorlage:Toter Link |errNS = 0 |template = Vorlage:Toter Link |format = |preview = 1 }}{{#if: https://archive.computerhistory.org/resources/text/Knuth_Don_X4100/PDF_index/k-5-pdf/k-5-u2456-Rechenplanfortigung-german.pdf | {{#if:{{#invoke:URLutil|isWebURL|https://archive.computerhistory.org/resources/text/Knuth_Don_X4100/PDF_index/k-5-pdf/k-5-u2456-Rechenplanfortigung-german.pdf}} || {{#if: || }} }} }}{{#if: | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}} || {{#if: || }} }} }}{{#switch: deadurl |checked|deadurl|= |#default= {{#if: || }} }}[https://archive.computerhistory.org/resources/text/Knuth_Don_X4100/PDF_index/k-5-pdf/k-5-u2456-Rechenplanfortigung-german.pdf }}|{{#switch: |0|=Vorlage:Toter Link/Core{{#if: https://archive.computerhistory.org/resources/text/Knuth_Don_X4100/PDF_index/k-5-pdf/k-5-u2456-Rechenplanfortigung-german.pdf | {{#if: | [2] }} (Seite {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. Suche im Internet Archive ){{#if: | {{#if: | | Vorlage:Toter Link/archivebot }} }} | (Seite {{#switch:|no|0|=|#default=dauerhaft }}nicht mehr abrufbar{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}.) }}{{#switch: |no|0|= |#default={{#if: || }} }}{{#invoke:TemplatePar|check |opt = inline= url= text= datum= date= archivebot= bot= botlauf= fix-attempted= checked= |cat = Wikipedia:Vorlagenfehler/Vorlage:Toter Link |errNS = 0 |template = Vorlage:Toter Link |format = |preview = 1 }}{{#if: https://archive.computerhistory.org/resources/text/Knuth_Don_X4100/PDF_index/k-5-pdf/k-5-u2456-Rechenplanfortigung-german.pdf | {{#if:{{#invoke:URLutil|isWebURL|https://archive.computerhistory.org/resources/text/Knuth_Don_X4100/PDF_index/k-5-pdf/k-5-u2456-Rechenplanfortigung-german.pdf}} || {{#if: || }} }} | {{#if: | {{#if: || }} | {{#if: || }} }} }}{{#if: | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}} || {{#if: || }} }} }}{{#switch: |checked|deadurl|= |#default= {{#if: || }} }}|#default= https://wiki-de.moshellshocker.dns64.de/index.php?title=Wikipedia:Defekte_Weblinks&dwl=https://archive.computerhistory.org/resources/text/Knuth_Don_X4100/PDF_index/k-5-pdf/k-5-u2456-Rechenplanfortigung-german.pdf Die nachstehende Seite ist {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar]{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. (Suche im Internet Archive. ) {{#if: | {{#if: | | Vorlage:Toter Link/archivebot }} }}Vorlage:Toter Link/Core{{#switch: |no|0|= |#default= {{#if: || }} }}{{#invoke:TemplatePar|check |all = inline= url= |opt = datum= date= archivebot= bot= botlauf= fix-attempted= checked= |cat = Wikipedia:Vorlagenfehler/Vorlage:Toter Link |errNS = 0 |template = Vorlage:Toter Link |format = |preview = 1 }}{{#if: https://archive.computerhistory.org/resources/text/Knuth_Don_X4100/PDF_index/k-5-pdf/k-5-u2456-Rechenplanfortigung-german.pdf | {{#if:{{#invoke:URLutil|isWebURL|https://archive.computerhistory.org/resources/text/Knuth_Don_X4100/PDF_index/k-5-pdf/k-5-u2456-Rechenplanfortigung-german.pdf}} || {{#if: || }} }} }}{{#if: | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}} || {{#if: || }} }} }}{{#switch: |checked|deadurl|= |#default= {{#if: || }} }}[https://archive.computerhistory.org/resources/text/Knuth_Don_X4100/PDF_index/k-5-pdf/k-5-u2456-Rechenplanfortigung-german.pdf }} }}}}}}}}}}{{#if:| {{#invoke:Vorlage:Internetquelle|archivBot|stamp={{{archiv-bot}}}|text={{#if:|Vorlage:Webarchiv/archiv-bot}}
}}}}{{#invoke:TemplatePar|check |all= url= titel= |opt= autor= hrsg= format= sprache= titelerg= werk= seiten= datum= abruf= zugriff= abruf-verborgen= archiv-url= archiv-datum= archiv-bot= kommentar= zitat= AT= CH= offline= |cat= {{#ifeq: 0 | 0 | Wikipedia:Vorlagenfehler/Vorlage:Internetquelle}} |template= Vorlage:Internetquelle |format=0 |preview=1 }}</ref>}} oder {{#if:trim|„Strecken einer Schleife“<ref>{{#invoke:Vorlage:Literatur|f}}</ref>,}} ist eine Optimierungsmethode, die die Laufzeit eines Computerprogramms auf Kosten der Größe seiner Programmdatei beschleunigen kann.<ref name="ullman77" /> Dabei wird eine Schleife
- entweder durch eine äquivalente Schleife ersetzt, die mehrere Kopien des Schleifenrumpfes enthält und dafür eine geringere Anzahl an Durchläufen hat,
- oder komplett aufgelöst, indem der Schleifenrumpf so oft aneinandergereiht wird, wie die ursprüngliche Anzahl Durchläufe war.
Dadurch wird die Schleifenbedingung seltener oder gar nicht mehr überprüft. Es wird ferner oft ermöglicht, anschließend weitere Optimierungen des (entrollten) Schleifenrumpfes durchzuführen. Die Anzahl der Kopien des ursprünglichen Schleifenrumpfes wird Abrollfaktor ({{#invoke:Vorlage:lang|full|CODE=en|SCRIPTING=Latn|SERVICE=englisch}}) genannt.<ref name="muchnick" /><ref name="intel_opt_man" />
Moderne Compiler versuchen Schleifen automatisch zu entrollen, falls auf Geschwindigkeit optimiert werden soll.<ref>Intel C++ Compiler XE 13.0 User and Reference Guides: O</ref><ref>GCC 4.7.2 Manual: Optimization Options</ref> Ist bekannt, auf welcher Architektur genau ein Programm später ausgeführt wird, kann eine manuelle Optimierung jedoch überlegen sein.<ref name="amd2002" />
Kommen die Wiederholungen durch Selbst-Aufrufe (Rekursionen) zustande, lassen sich durch Vervielfältigung des Prozedurrumpfes Prozeduraufrufe und -rücksprünge einsparen. In solchen Fällen spricht man von Recursion unrolling.
Idee
Die ursprüngliche Idee des Loop unrolling war es, das Verhältnis von Schleifenrumpf zu Schleifenkontrollanweisungen zu optimieren.<ref name="duff83" /> Da heutige Prozessoren komplexe Mechanismen zur Optimierung des Programmflusses besitzen (z. B. Sprungvorhersage und Pipelining), kann der entrollte Schleifenrumpf noch weiter optimiert werden.
Ansatz
Bei einer Schleife muss bei jedem Durchlauf die sog. Schleifenbedingung geprüft werden, ob ein weiterer Durchlauf stattfinden soll. Gerade bei Schleifen mit sehr kleinem Rumpf kann diese Prüfung einen großen Anteil der Laufzeit ausmachen.
<syntaxhighlight lang="cpp"> for( i=0 ; i<8 ; i=i+1 )
dest[i] = src[i];
</syntaxhighlight>
Eine solche Schleife besteht nur aus wenigen Anweisungen: Kopieren, Erhöhen des Zählers, Prüfen der Bedingung und ggf. ein Sprung. Somit verbringt der Prozessor etwa die Hälfte der Zeit nur mit Kontrollanweisungen.<ref name="duff83" />
Eine naheliegende Optimierung ist es, die Schleife durch n Kopien ihres Schleifenkörpers zu ersetzen (vollständiges Entrollen). Schleifenkontrollanweisungen und -zähler entfallen dann ganz:
<syntaxhighlight lang="cpp"> 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]; </syntaxhighlight>
Teilweises Entrollen
Wenn ein vollständiges Entrollen nicht möglich oder nicht sinnvoll ist, kann alternativ auch der ursprüngliche Schleifenrumpf mehrmals innerhalb einer Iteration ausgeführt werden (teilweises Entrollen). Dadurch sinkt die Anzahl der auszuführenden Kontrollanweisungen.
Dabei wird der ursprüngliche Schleifenrumpf durch eine weitere Schleife ersetzt, deren Durchläufe dem Abrollfaktor entsprechen (hier: 2):
<syntaxhighlight lang="cpp"> for( i=0 ; i<8 ; i=i+2 ) {
for( j=0; j<2; j=j+1 )
dest[i+j] = src[i+j];
} </syntaxhighlight>
Anschließend wird die innere Schleife komplett entrollt:
<syntaxhighlight lang="cpp"> for( i=0 ; i<8 ; i=i+2) {
dest[i] = src[i]; dest[i+1] = src[i+1];
} </syntaxhighlight>
Ein teilweises Entrollen kann verwendet werden, wenn
- die Anzahl der Schleifendurchläufe bei der Übersetzung noch nicht bekannt ist (siehe hierzu auch Duff’s Device),
- der Schleifenrumpf zu lang oder die Anzahl der Iterationen zu hoch ist, d. h. der erzeugte Maschinencode zu groß würde.
Verschnitt
Dabei besteht immer die Möglichkeit, dass die Anzahl der ursprünglichen Iterationen kein ganzzahliges Vielfaches der Durchläufe der entrollten Schleife ist. Es verbleibt dann ein Rest bzw. ein partieller Durchlauf der entrollten Schleife, der gesondert behandelt werden muss.
Beispiel: Die Anzahl der Durchläufe ergebe sich erst zur Laufzeit, die ursprüngliche Schleife sei 10-fach entrollt worden (d. h. der ursprüngliche Schleifenkörper steht 10-mal im neuen Schleifenkörper). Zur Laufzeit ergibt sich, dass 1005 Iterationen berechnet werden sollen, also 100 Durchläufe, die 10-fach rechnen – bleibt (in diesem Programmlauf) ein Rest von 5 Iterationen.
Es können nun folgende Maßnahmen ergriffen werden:
- Den Rest vollständig entrollen, sofern schon zum Übersetzungszeitpunkt die Anzahl der Schleifendurchläufe bekannt ist,
- den Rest in einer eigenen Schleife einzeln verarbeiten (wie in der ursprünglichen Schleife),
- den entrollten Schleifenrumpf nur teilweise ausführen (siehe Duff’s Device) oder
- die zu verarbeitenden Daten auf ein ganzzahliges Vielfaches der inneren Schleife auffüllen.
Vorteile
- Weniger auszuführende Befehle<ref name="fog2012">{{#if:|{{#iferror: {{#iferror:{{#invoke:Vorlage:FormatDate|Execute}}|}}| |}}}}{{#if:Agner Fog|Agner Fog: }}{{#if:|{{#if:Optimizing subroutines in assembly language|[{{#invoke:Vorlage:Internetquelle|archivURL|1={{#invoke:URLutil|getNormalized|1={{{archiv-url}}}}}}} {{#invoke:Vorlage:Internetquelle|TitelFormat|titel=Optimizing subroutines in assembly language}}]{{#if:PDF; 873 kB| (PDF; 873 kB)}}{{#if:| {{{titelerg}}}{{#invoke:Vorlage:Internetquelle|Endpunkt|titel={{{titelerg}}}}}}}}}|{{#if:https://www.agner.org/optimize/optimizing_assembly.pdf%7C{{#if:{{#invoke:TemplUtl%7Cfaculty%7C}}%7C{{#invoke:Vorlage:Internetquelle%7CTitelFormat%7Ctitel={{#invoke:WLink%7CgetEscapedTitle%7C1=Optimizing subroutines in assembly language}}}}|[{{#invoke:URLutil|getNormalized|1=https://www.agner.org/optimize/optimizing_assembly.pdf}} {{#invoke:Vorlage:Internetquelle|TitelFormat|titel={{#invoke:WLink|getEscapedTitle|1=Optimizing subroutines in assembly language}}}}]}}{{#if:PDF; 873 kB| (PDF; 873 kB{{#if:Copenhagen University College of Engineering2012-02-29100{{#if: 2012-09-22 | {{#if:{{#invoke:TemplUtl|faculty|}}||1}}}}
| )
| {{#if:{{#ifeq:englisch|de||{{#if:englisch|1}}}}| ;
| )}}}}}}{{#if:| {{{titelerg}}}{{#invoke:Vorlage:Internetquelle|Endpunkt|titel={{{titelerg}}}}}}}}}}}{{#if:https://www.agner.org/optimize/optimizing_assembly.pdf%7C{{#if:{{#invoke:URLutil%7CisResourceURL%7C1=https://www.agner.org/optimize/optimizing_assembly.pdf}}%7C%7C}}}}{{#if:Optimizing subroutines in assembly language|{{#if:{{#invoke:WLink|isValidLinktext|1=Optimizing subroutines in assembly language|lines=0}}||}}}}{{#if: | In: {{#invoke:Vorlage:Internetquelle|TitelFormat|titel={{{werk}}}}}}}{{#if: Copenhagen University College of Engineering| Copenhagen University College of Engineering{{#if: 2012-02-29100|,|{{#if: 2012-09-22 | {{#if:{{#invoke:TemplUtl|faculty|}}||,}}}}}}}}{{#if: 2012-02-29| {{#if:{{#invoke:DateTime|format|2012-02-29|noerror=1}}
|{{#invoke:DateTime|format|2012-02-29|T._Monat JJJJ}}
|{{#invoke:TemplUtl|failure|1=Fehler bei Vorlage:Internetquelle, datum=2012-02-29|class=Zitationswartung}} }}{{#if: 100|,|{{#if: 2012-09-22 | {{#if:{{#invoke:TemplUtl|faculty|}}||,}}}}}}}}{{#if: 100| S. 100{{#if: |,|{{#if: 2012-09-22 | {{#if:{{#invoke:TemplUtl|faculty|}}||,}}}}}}}}{{#if: {{#invoke:TemplUtl|faculty|}}| {{#if:1002012-02-29Copenhagen University College of Engineering|{{#if:|archiviert|ehemals}}|{{#if:|Archiviert|Ehemals}}}} {{#if:|vom|im}} Vorlage:Referrer{{#if:{{#invoke:TemplUtl|faculty|}}| (nicht mehr online verfügbar)}}{{#if: | am {{#iferror: {{#iferror:{{#invoke:Vorlage:FormatDate|Execute}}|}}|{{{archiv-datum}}}{{#if:2049881||(?)}}}}}}{{#if: 12.11 Loop unrolling2012-09-22|;}}}}{{#if: 2012-09-22| {{#if:1002012-02-29Copenhagen University College of Engineering{{#invoke:TemplUtl|faculty|}}|abgerufen|Abgerufen}} {{#switch: {{#invoke:Str|len| {{#invoke:DateTime|format| 2012-09-22 |ISO|noerror=1}} }}
|4=im Jahr
|7=im
|10=am
|#default={{#invoke:TemplUtl|failure|1=Fehler bei Vorlage:Internetquelle, abruf=2012-09-22|class=Zitationswartung}} }} {{#invoke:DateTime|format|2012-09-22|T._Monat JJJJ}}
| {{#invoke:TemplUtl|failure|1=Vorlage:Internetquelle | abruf=2026-MM-TT ist Pflichtparameter}} }}{{#if:{{#ifeq:englisch|de||{{#if:englisch|1}}}}|{{#if:Copenhagen University College of Engineering2012-02-29100{{#if: 2012-09-22 | {{#if:{{#invoke:TemplUtl|faculty|}}||1}}}}
| (
| {{#if:PDF; 873 kB | | (}}
}}{{#ifeq:{{#if:englisch|englisch|de}}|de||
{{#invoke:Multilingual|format|englisch|slang=!|split=[%s,]+|shift=m|separator=, }}}}{{#if: |{{#ifeq:{{#if:englisch|englisch|de}}|de||, }}{{{kommentar}}}}})}}{{#if: 2012-02-29100{{#if: 2012-09-22 | {{#if:{{#invoke:TemplUtl|faculty|}}||1}} }}englisch12.11 Loop unrolling|{{#if: 12.11 Loop unrolling|: {{
#if:
| „{{
#ifeq: {{#if:{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|de}} | de
| Vorlage:Str trim
| {{#invoke:Vorlage:lang|flat}}
}}“
| {{#ifeq: {{#if:{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|de}} | de
| „Vorlage:Str trim“
| {{#invoke:Text|quote
|1={{#if:
| {{#invoke:Vorlage:lang|flat}}
| {{#invoke:Vorlage:lang|flat}} }}
|2={{#if: {{#invoke:TemplUtl|faculty|}}|de-CH|de}}
|3=1}} }}
}}{{#if:
| (<templatestyles src="Person/styles.css" />{{#if: | : }}{{#if: | , deutsch: „“ }})
| {{#if:
| ({{#if: | , deutsch: „“ }})
| {{#if: | (deutsch: „“) }}
}}
}}{{#if: 12.11 Loop unrolling
| {{#if:
| {{#if: 12.11 Loop unrolling
| Vorlage:": Text= und 1= gleichzeitig, bzw. Pipe zu viel }} }}
| Vorlage:": Text= fehlt }}{{#if: | {{#if: {{#invoke:Text|unstrip|{{{ref}}}}}
| Vorlage:": Ungültiger Wert: ref=
| {{{ref}}} }}
}}|.{{#if:{{#invoke:TemplUtl|faculty|}}|{{#if:||{{#ifeq: | JaKeinHinweis |{{#switch:
|0|=Vorlage:Toter Link/Core{{#if: https://www.agner.org/optimize/optimizing_assembly.pdf | {{#if: | [3] }} (Seite {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. Suche im Internet Archive ){{#if: | {{#if: deadurlausgeblendet | | Vorlage:Toter Link/archivebot }} }} | (Seite {{#switch:|no|0|=|#default=dauerhaft }}nicht mehr abrufbar{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}.) }}{{#switch: |no|0|= |#default={{#if: || }} }}{{#invoke:TemplatePar|check |opt = inline= url= text= datum= date= archivebot= bot= botlauf= fix-attempted= checked= |cat = Wikipedia:Vorlagenfehler/Vorlage:Toter Link |errNS = 0 |template = Vorlage:Toter Link |format = |preview = 1 }}{{#if: https://www.agner.org/optimize/optimizing_assembly.pdf | {{#if:{{#invoke:URLutil|isWebURL|https://www.agner.org/optimize/optimizing_assembly.pdf}} || {{#if: || }} }} | {{#if: | {{#if: || }} | {{#if: || }} }} }}{{#if: | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}} || {{#if: || }} }} }}{{#switch: deadurl |checked|deadurl|= |#default= {{#if: || }} }}|#default= https://wiki-de.moshellshocker.dns64.de/index.php?title=Wikipedia:Defekte_Weblinks&dwl=https://www.agner.org/optimize/optimizing_assembly.pdf Die nachstehende Seite ist {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar]{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. (Suche im Internet Archive. ) {{#if: | {{#if: deadurlausgeblendet | | Vorlage:Toter Link/archivebot }} }}Vorlage:Toter Link/Core{{#switch: |no|0|= |#default= {{#if: || }} }}{{#invoke:TemplatePar|check |all = inline= url= |opt = datum= date= archivebot= bot= botlauf= fix-attempted= checked= |cat = Wikipedia:Vorlagenfehler/Vorlage:Toter Link |errNS = 0 |template = Vorlage:Toter Link |format = |preview = 1 }}{{#if: https://www.agner.org/optimize/optimizing_assembly.pdf | {{#if:{{#invoke:URLutil|isWebURL|https://www.agner.org/optimize/optimizing_assembly.pdf}} || {{#if: || }} }} }}{{#if: | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}} || {{#if: || }} }} }}{{#switch: deadurl |checked|deadurl|= |#default= {{#if: || }} }}[https://www.agner.org/optimize/optimizing_assembly.pdf }}|{{#switch: |0|=Vorlage:Toter Link/Core{{#if: https://www.agner.org/optimize/optimizing_assembly.pdf | {{#if: | [4] }} (Seite {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. Suche im Internet Archive ){{#if: | {{#if: | | Vorlage:Toter Link/archivebot }} }} | (Seite {{#switch:|no|0|=|#default=dauerhaft }}nicht mehr abrufbar{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}.) }}{{#switch: |no|0|= |#default={{#if: || }} }}{{#invoke:TemplatePar|check |opt = inline= url= text= datum= date= archivebot= bot= botlauf= fix-attempted= checked= |cat = Wikipedia:Vorlagenfehler/Vorlage:Toter Link |errNS = 0 |template = Vorlage:Toter Link |format = |preview = 1 }}{{#if: https://www.agner.org/optimize/optimizing_assembly.pdf | {{#if:{{#invoke:URLutil|isWebURL|https://www.agner.org/optimize/optimizing_assembly.pdf}} || {{#if: || }} }} | {{#if: | {{#if: || }} | {{#if: || }} }} }}{{#if: | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}} || {{#if: || }} }} }}{{#switch: |checked|deadurl|= |#default= {{#if: || }} }}|#default= https://wiki-de.moshellshocker.dns64.de/index.php?title=Wikipedia:Defekte_Weblinks&dwl=https://www.agner.org/optimize/optimizing_assembly.pdf Die nachstehende Seite ist {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar]{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. (Suche im Internet Archive. ) {{#if: | {{#if: | | Vorlage:Toter Link/archivebot }} }}Vorlage:Toter Link/Core{{#switch: |no|0|= |#default= {{#if: || }} }}{{#invoke:TemplatePar|check |all = inline= url= |opt = datum= date= archivebot= bot= botlauf= fix-attempted= checked= |cat = Wikipedia:Vorlagenfehler/Vorlage:Toter Link |errNS = 0 |template = Vorlage:Toter Link |format = |preview = 1 }}{{#if: https://www.agner.org/optimize/optimizing_assembly.pdf | {{#if:{{#invoke:URLutil|isWebURL|https://www.agner.org/optimize/optimizing_assembly.pdf}} || {{#if: || }} }} }}{{#if: | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}} || {{#if: || }} }} }}{{#switch: |checked|deadurl|= |#default= {{#if: || }} }}[https://www.agner.org/optimize/optimizing_assembly.pdf }} }}}}}}}}}}{{#if:| {{#invoke:Vorlage:Internetquelle|archivBot|stamp={{{archiv-bot}}}|text={{#if:|Vorlage:Webarchiv/archiv-bot}}
}}}}{{#invoke:TemplatePar|check |all= url= titel= |opt= autor= hrsg= format= sprache= titelerg= werk= seiten= datum= abruf= zugriff= abruf-verborgen= archiv-url= archiv-datum= archiv-bot= kommentar= zitat= AT= CH= offline= |cat= {{#ifeq: 0 | 0 | Wikipedia:Vorlagenfehler/Vorlage:Internetquelle}} |template= Vorlage:Internetquelle |format=0 |preview=1 }}</ref>: Durch den Wegfall oder das seltenere Ausführen der Kontrollanweisungen sinkt die Ausführungszeit.
- Verbesserte Registerzuteilung: Der Schleifenzähler muss seltener oder gar nicht mehr in ein Register geladen werden. Dadurch stehen mehr Register für andere Berechnungen zur Verfügung.
- Latenzverdeckung ({{#invoke:Vorlage:lang|full|CODE=en|SCRIPTING=Latn|SERVICE=englisch}}): Tritt eine Verzögerung durch Zugriff auf einen langsameren Speicher auf, kann der nächste (entrollte) Durchlauf begonnen oder sogar parallel abgearbeitet werden (Pipelining).
- Entfernen von gemeinsam verwendetem Code ({{#invoke:Vorlage:lang|full|CODE=en|SCRIPTING=Latn|SERVICE=englisch}}): Mehrfache Berechnungen des gleichen Wertes können entfernt werden.
- Vektorisierung: Die Anweisungen können vektorisiert werden, d. h. mehrere Berechnungen können innerhalb eines Befehls zusammengefasst werden (z. B. von SSE).
- optimierter Speicherzugriff: Speicherzugriffe können so umgeordnet werden, dass sie das Prefetching des Prozessors oder Write-Through des Caches besser berücksichtigen.
Nachteile
- Manuelles Entrollen verschlechtert meist die Lesbarkeit des Quelltextes.
- Die Größe des Programms wächst, da die Anzahl der Instruktionen steigt. Es muss berücksichtigt werden, dass die Wahrscheinlichkeit steigt, dass Programmteile aus dem Befehlscache verdrängt werden und das langsame Nachladen den Geschwindigkeitsvorteil kompensiert.
- Evtl. können nicht mehr alle von der Schleife benötigten Variablen in Registern gespeichert werden, insbesondere bei registerarmen Architekturen wie z. B. x86. Dann muss auf den Hauptspeicher (oder den Prozessorcache) ausgewichen werden, der meist langsamer ist.<ref name="amd2002">{{#if:|{{#iferror: {{#iferror:{{#invoke:Vorlage:FormatDate|Execute}}|}}| |}}}}{{#if:Mike Wall|Mike Wall: }}{{#if:|{{#if:Using Block Prefetch for Optimized Memory Performance|[{{#invoke:Vorlage:Internetquelle|archivURL|1={{#invoke:URLutil|getNormalized|1={{{archiv-url}}}}}}} {{#invoke:Vorlage:Internetquelle|TitelFormat|titel=Using Block Prefetch for Optimized Memory Performance}}]{{#if:PDF; 136 kB| (PDF; 136 kB)}}{{#if:| {{{titelerg}}}{{#invoke:Vorlage:Internetquelle|Endpunkt|titel={{{titelerg}}}}}}}}}|{{#if:http://web.mit.edu/ehliu/Public/ProjectX/Meetings/AMD_block_prefetch_paper.pdf%7C{{#if:{{#invoke:TemplUtl%7Cfaculty%7C}}%7C{{#invoke:Vorlage:Internetquelle%7CTitelFormat%7Ctitel={{#invoke:WLink%7CgetEscapedTitle%7C1=Using Block Prefetch for Optimized Memory Performance}}}}|[{{#invoke:URLutil|getNormalized|1=http://web.mit.edu/ehliu/Public/ProjectX/Meetings/AMD_block_prefetch_paper.pdf}} {{#invoke:Vorlage:Internetquelle|TitelFormat|titel={{#invoke:WLink|getEscapedTitle|1=Using Block Prefetch for Optimized Memory Performance}}}}]}}{{#if:PDF; 136 kB| (PDF; 136 kB{{#if:mit.edu2002-03-19{{#if: 2012-09-22 | {{#if:{{#invoke:TemplUtl|faculty|}}||1}}}}
| )
| {{#if:{{#ifeq:englisch|de||{{#if:englisch|1}}}}| ;
| )}}}}}}{{#if:| {{{titelerg}}}{{#invoke:Vorlage:Internetquelle|Endpunkt|titel={{{titelerg}}}}}}}}}}}{{#if:http://web.mit.edu/ehliu/Public/ProjectX/Meetings/AMD_block_prefetch_paper.pdf%7C{{#if:{{#invoke:URLutil%7CisResourceURL%7C1=http://web.mit.edu/ehliu/Public/ProjectX/Meetings/AMD_block_prefetch_paper.pdf}}%7C%7C}}}}{{#if:Using Block Prefetch for Optimized Memory Performance|{{#if:{{#invoke:WLink|isValidLinktext|1=Using Block Prefetch for Optimized Memory Performance|lines=0}}||}}}}{{#if: | In: {{#invoke:Vorlage:Internetquelle|TitelFormat|titel={{{werk}}}}}}}{{#if: mit.edu| mit.edu{{#if: 2002-03-19|,|{{#if: 2012-09-22 | {{#if:{{#invoke:TemplUtl|faculty|}}||,}}}}}}}}{{#if: 2002-03-19| {{#if:{{#invoke:DateTime|format|2002-03-19|noerror=1}}
|{{#invoke:DateTime|format|2002-03-19|T._Monat JJJJ}}
|{{#invoke:TemplUtl|failure|1=Fehler bei Vorlage:Internetquelle, datum=2002-03-19|class=Zitationswartung}} }}{{#if: |,|{{#if: 2012-09-22 | {{#if:{{#invoke:TemplUtl|faculty|}}||,}}}}}}}}{{#if: | S. {{{seiten}}}{{#if: |,|{{#if: 2012-09-22 | {{#if:{{#invoke:TemplUtl|faculty|}}||,}}}}}}}}{{#if: {{#invoke:TemplUtl|faculty|}}| {{#if:2002-03-19mit.edu|{{#if:|archiviert|ehemals}}|{{#if:|Archiviert|Ehemals}}}} {{#if:|vom|im}} Vorlage:Referrer{{#if:{{#invoke:TemplUtl|faculty|}}| (nicht mehr online verfügbar)}}{{#if: | am {{#iferror: {{#iferror:{{#invoke:Vorlage:FormatDate|Execute}}|}}|{{{archiv-datum}}}{{#if:2049881||(?)}}}}}}{{#if: 2012-09-22|;}}}}{{#if: 2012-09-22| {{#if:2002-03-19mit.edu{{#invoke:TemplUtl|faculty|}}|abgerufen|Abgerufen}} {{#switch: {{#invoke:Str|len| {{#invoke:DateTime|format| 2012-09-22 |ISO|noerror=1}} }}
|4=im Jahr
|7=im
|10=am
|#default={{#invoke:TemplUtl|failure|1=Fehler bei Vorlage:Internetquelle, abruf=2012-09-22|class=Zitationswartung}} }} {{#invoke:DateTime|format|2012-09-22|T._Monat JJJJ}}
| {{#invoke:TemplUtl|failure|1=Vorlage:Internetquelle | abruf=2026-MM-TT ist Pflichtparameter}} }}{{#if:{{#ifeq:englisch|de||{{#if:englisch|1}}}}|{{#if:mit.edu2002-03-19{{#if: 2012-09-22 | {{#if:{{#invoke:TemplUtl|faculty|}}||1}}}}
| (
| {{#if:PDF; 136 kB | | (}}
}}{{#ifeq:{{#if:englisch|englisch|de}}|de||
{{#invoke:Multilingual|format|englisch|slang=!|split=[%s,]+|shift=m|separator=, }}}}{{#if: |{{#ifeq:{{#if:englisch|englisch|de}}|de||, }}{{{kommentar}}}}})}}{{#if: 2002-03-19{{#if: 2012-09-22 | {{#if:{{#invoke:TemplUtl|faculty|}}||1}} }}englisch|{{#if: |: {{
#if:
| „{{
#ifeq: {{#if:{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|de}} | de
| Vorlage:Str trim
| {{#invoke:Vorlage:lang|flat}}
}}“
| {{#ifeq: {{#if:{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|{{#if: {{#invoke:templutl|faculty|}}|de-ch|de}}|de}} | de
| „Vorlage:Str trim“
| {{#invoke:Text|quote
|1={{#if:
| {{#invoke:Vorlage:lang|flat}}
| {{#invoke:Vorlage:lang|flat}} }}
|2={{#if: {{#invoke:TemplUtl|faculty|}}|de-CH|de}}
|3=1}} }}
}}{{#if:
| (<templatestyles src="Person/styles.css" />{{#if: | : }}{{#if: | , deutsch: „“ }})
| {{#if:
| ({{#if: | , deutsch: „“ }})
| {{#if: | (deutsch: „“) }}
}}
}}{{#if: {{{zitat}}}
| {{#if:
| {{#if: {{{zitat}}}
| Vorlage:": Text= und 1= gleichzeitig, bzw. Pipe zu viel }} }}
| Vorlage:": Text= fehlt }}{{#if: | {{#if: {{#invoke:Text|unstrip|{{{ref}}}}}
| Vorlage:": Ungültiger Wert: ref=
| {{{ref}}} }}
}}|.{{#if:{{#invoke:TemplUtl|faculty|}}|{{#if:||{{#ifeq: | JaKeinHinweis |{{#switch:
|0|=Vorlage:Toter Link/Core{{#if: http://web.mit.edu/ehliu/Public/ProjectX/Meetings/AMD_block_prefetch_paper.pdf | {{#if: | [5] }} (Seite {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. Suche im Internet Archive ){{#if: | {{#if: deadurlausgeblendet | | Vorlage:Toter Link/archivebot }} }} | (Seite {{#switch:|no|0|=|#default=dauerhaft }}nicht mehr abrufbar{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}.) }}{{#switch: |no|0|= |#default={{#if: || }} }}{{#invoke:TemplatePar|check |opt = inline= url= text= datum= date= archivebot= bot= botlauf= fix-attempted= checked= |cat = Wikipedia:Vorlagenfehler/Vorlage:Toter Link |errNS = 0 |template = Vorlage:Toter Link |format = |preview = 1 }}{{#if: http://web.mit.edu/ehliu/Public/ProjectX/Meetings/AMD_block_prefetch_paper.pdf | {{#if:{{#invoke:URLutil|isWebURL|http://web.mit.edu/ehliu/Public/ProjectX/Meetings/AMD_block_prefetch_paper.pdf}} || {{#if: || }} }} | {{#if: | {{#if: || }} | {{#if: || }} }} }}{{#if: | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}} || {{#if: || }} }} }}{{#switch: deadurl |checked|deadurl|= |#default= {{#if: || }} }}|#default= https://wiki-de.moshellshocker.dns64.de/index.php?title=Wikipedia:Defekte_Weblinks&dwl=http://web.mit.edu/ehliu/Public/ProjectX/Meetings/AMD_block_prefetch_paper.pdf Die nachstehende Seite ist {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar]{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. (Suche im Internet Archive. ) {{#if: | {{#if: deadurlausgeblendet | | Vorlage:Toter Link/archivebot }} }}Vorlage:Toter Link/Core{{#switch: |no|0|= |#default= {{#if: || }} }}{{#invoke:TemplatePar|check |all = inline= url= |opt = datum= date= archivebot= bot= botlauf= fix-attempted= checked= |cat = Wikipedia:Vorlagenfehler/Vorlage:Toter Link |errNS = 0 |template = Vorlage:Toter Link |format = |preview = 1 }}{{#if: http://web.mit.edu/ehliu/Public/ProjectX/Meetings/AMD_block_prefetch_paper.pdf | {{#if:{{#invoke:URLutil|isWebURL|http://web.mit.edu/ehliu/Public/ProjectX/Meetings/AMD_block_prefetch_paper.pdf}} || {{#if: || }} }} }}{{#if: | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}} || {{#if: || }} }} }}{{#switch: deadurl |checked|deadurl|= |#default= {{#if: || }} }}[http://web.mit.edu/ehliu/Public/ProjectX/Meetings/AMD_block_prefetch_paper.pdf }}|{{#switch: |0|=Vorlage:Toter Link/Core{{#if: http://web.mit.edu/ehliu/Public/ProjectX/Meetings/AMD_block_prefetch_paper.pdf | {{#if: | [6] }} (Seite {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. Suche im Internet Archive ){{#if: | {{#if: | | Vorlage:Toter Link/archivebot }} }} | (Seite {{#switch:|no|0|=|#default=dauerhaft }}nicht mehr abrufbar{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}.) }}{{#switch: |no|0|= |#default={{#if: || }} }}{{#invoke:TemplatePar|check |opt = inline= url= text= datum= date= archivebot= bot= botlauf= fix-attempted= checked= |cat = Wikipedia:Vorlagenfehler/Vorlage:Toter Link |errNS = 0 |template = Vorlage:Toter Link |format = |preview = 1 }}{{#if: http://web.mit.edu/ehliu/Public/ProjectX/Meetings/AMD_block_prefetch_paper.pdf | {{#if:{{#invoke:URLutil|isWebURL|http://web.mit.edu/ehliu/Public/ProjectX/Meetings/AMD_block_prefetch_paper.pdf}} || {{#if: || }} }} | {{#if: | {{#if: || }} | {{#if: || }} }} }}{{#if: | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}} || {{#if: || }} }} }}{{#switch: |checked|deadurl|= |#default= {{#if: || }} }}|#default= https://wiki-de.moshellshocker.dns64.de/index.php?title=Wikipedia:Defekte_Weblinks&dwl=http://web.mit.edu/ehliu/Public/ProjectX/Meetings/AMD_block_prefetch_paper.pdf Die nachstehende Seite ist {{#switch:|no|0|=|dauerhaft }}nicht mehr abrufbar]{{#if: | , festgestellt im {{#invoke:DateTime|format||F Y}} }}. (Suche im Internet Archive. ) {{#if: | {{#if: | | Vorlage:Toter Link/archivebot }} }}Vorlage:Toter Link/Core{{#switch: |no|0|= |#default= {{#if: || }} }}{{#invoke:TemplatePar|check |all = inline= url= |opt = datum= date= archivebot= bot= botlauf= fix-attempted= checked= |cat = Wikipedia:Vorlagenfehler/Vorlage:Toter Link |errNS = 0 |template = Vorlage:Toter Link |format = |preview = 1 }}{{#if: http://web.mit.edu/ehliu/Public/ProjectX/Meetings/AMD_block_prefetch_paper.pdf | {{#if:{{#invoke:URLutil|isWebURL|http://web.mit.edu/ehliu/Public/ProjectX/Meetings/AMD_block_prefetch_paper.pdf}} || {{#if: || }} }} }}{{#if: | {{#if:{{#invoke:DateTime|format||F Y|noerror=1}} || {{#if: || }} }} }}{{#switch: |checked|deadurl|= |#default= {{#if: || }} }}[http://web.mit.edu/ehliu/Public/ProjectX/Meetings/AMD_block_prefetch_paper.pdf }} }}}}}}}}}}{{#if:| {{#invoke:Vorlage:Internetquelle|archivBot|stamp={{{archiv-bot}}}|text={{#if:|Vorlage:Webarchiv/archiv-bot}}
}}}}{{#invoke:TemplatePar|check |all= url= titel= |opt= autor= hrsg= format= sprache= titelerg= werk= seiten= datum= abruf= zugriff= abruf-verborgen= archiv-url= archiv-datum= archiv-bot= kommentar= zitat= AT= CH= offline= |cat= {{#ifeq: 0 | 0 | Wikipedia:Vorlagenfehler/Vorlage:Internetquelle}} |template= Vorlage:Internetquelle |format=0 |preview=1 }}</ref>
Manuelles Abrollen
Wann genau ein manuelles Abrollen besser als die automatische Compiler-Optimierung ist, kann auf Grund der fortschreitenden Entwicklung nicht allgemein beschrieben werden. Im Zweifelsfall müssen Laufzeitmessungen vorgenommen werden.
Allgemein gilt, dass die automatische Optimierung erschwert wird,
- je komplexer die Schleife ist (komplexe Berechnungen, viele Daten, innere Schleifen, abhängige Anzahl an Durchläufen),
- wenn bedingte Anweisungen ausgeführt werden (Kontrollflussabhängigkeiten) oder
- wenn (teilweise) rekursive Berechnungen durchgeführt werden (Datenflussabhängigkeiten).
Beispiel
Ein einfaches Beispiel, bei dem es heutigen Compilern (Stand: 2001) nicht gelingt, die Schleife automatisch zu entrollen, ist:<ref>{{#invoke:Vorlage:Literatur|f}}</ref>
<syntaxhighlight lang="cpp"> double sum = 0.0;
for (int i=0; i<n; ++i)
for (int j=0; j<n; ++j)
sum += x[i][j] * (i*i + j*j);
</syntaxhighlight>
Der Grund ist, dass der Faktor (i2 + j2) sowohl vom äußeren als auch vom inneren Schleifenindex abhängt. Von Hand lässt sich diese Schleife problemlos entrollen.
Siehe auch
Weblinks
- Intel 64 and IA-32 Architectures Software Developer Manuals, Intel 64 and IA-32 Architectures Software Developer’s Manual Combined Volumes:1, 2A, 2B, 2C, 3A, 3B, and 3C (PDF; 15,4 MB)
- AMD Developer Central: Developer Guides & Manuals, Software Optimization Guide for AMD Family 15h Processors (PDF; 2,0 MB)
- Kapitel 7, S. 8–10. (PDF; 2,2 MB), Michael Abrashs Graphics Programming Black Book mit einem Loop unrolling Beispiel in x86 Assembler (englisch)
- Optimizing subroutines in assembly language (PDF; 1,4 MB) Agner Fogs Optimierungshandbuch u. a. mit der Loop unrolling-Technik (englisch, 2012)
Einzelnachweise
<references> <ref name="muchnick">Steven S. Muchnick: Advanced Compiler Design & Implementation. Morgan Kaufmann Publishers, 1997, ISBN 1-55860-320-4.</ref> <ref name="intel_opt_man">Intel 64 and IA-32 Architectures Optimization Reference Manual</ref> <ref name="ullman77">Jeffrey D. Ullman, Alfred V. Aho: Principles of compiler design. Addison-Wesley, 1977, ISBN 0-201-10073-8.</ref> <ref name="duff83">Tom Duff on Duff’s Device auf www.lysator.liu.se (englisch)</ref> </references>
- Wikipedia:Vorlagenfehler/Parameter:URL
- Wikipedia:Vorlagenfehler/Parameter:Linktext
- Wikipedia:Vorlagenfehler/Parameter:Datum
- Wikipedia:Vorlagenfehler/Vorlage:"
- Wikipedia:Weblink offline fix-attempted
- Wikipedia:Vorlagenfehler/Vorlage:Toter Link
- Wikipedia:Vorlagenfehler/Vorlage:Toter Link/URL fehlt
- Programmierung
- Compilerbau