Wat is Loop unrolling?

Optimalisatie waarbij de lusinhoud meerdere keren achter elkaar wordt geschreven om het aantal iteraties te verminderen. Er is minder werk voor sprongen en het controleren van het aantal, en instructies zijn gemakkelijker te herschikken, maar de code wordt groter.

Japanse benaming: ループ展開

“Loop unrolling” komt voor in 6 oefenvragen uit 2 onderwerpen, bijv. Compilers, Geheugenhiërarchie en prestaties.

Vakgebied: Compilers

Nu oefenen: vragen over Loop unrolling

Welk effect van loop unrolling is juist?

  1. AHet testen van het aantal iteraties en sprongen neemt af en instructies zijn gemakkelijker te herordenen
  2. BDe body van de lus wordt slechts één keer geschreven, waardoor de programmacode kleiner wordt
  3. CDe lus wordt als functie afgesplitst, zodat hij vanaf andere plaatsen kan worden aangeroepen
Antwoord en toelichting tonen

Antwoord: A. Het testen van het aantal iteraties en sprongen neemt af en instructies zijn gemakkelijker te herordenen

Loop unrolling is een optimalisatie waarbij de body van de lus bijvoorbeeld viermaal achter elkaar wordt geschreven en het aantal iteraties een vierde wordt. Naast minder test- en sprong-instructies kunnen instructies van de naast elkaar geplaatste bodies worden gecombineerd en herordend, zodat wachttijden van berekeningen gemakkelijker worden opgevuld. De code wordt daarentegen groter en kan de instructiecache onder druk zetten. Dat de body één keer wordt geschreven en de code kleiner wordt, is een omgekeerde beschrijving, en het afsplitsen van een lus als functie is een andere transformatie.

Hoeveel keer worden de iteratietest en sprong uitgevoerd als een lus met 100 iteraties wordt herschreven met loop unrolling waarbij de body viermaal achter elkaar wordt gezet? (100 is deelbaar door 4.)

  1. A100 keer
  2. B25 keer
  3. C400 keer
Antwoord en toelichting tonen

Antwoord: B. 25 keer

Als de body viermaal achter elkaar wordt gezet, voert één iteratie het werk van vier oorspronkelijke iteraties uit, zodat het aantal iteraties 100 ÷ 4 = 25 wordt en ook de iteratietest en sprong 25 keer plaatsvinden. Vergeleken met de oorspronkelijke 100 wordt de overhead van sprongen enz. een vierde. Als het aantal niet deelbaar is door 4, wordt achteraan een korte lus toegevoegd om het restant te verwerken. 100 keer is het aantal zonder unrolling en 400 keer is een foutief vermenigvuldigde waarde van het aantal bewerkingen in de body.

“Loop unrolling” in de toelichting

Vragen met “Loop unrolling” (6)

  1. Welk effect van loop unrolling is juist?
  2. Hoeveel keer worden de iteratietest en sprong uitgevoerd als een lus met 100 iteraties wordt herschreven met loop unrolling waarbij de body viermaal achter elkaar wordt gezet? (100 is deelbaar door 4.)
  3. Welke uitspraak over een basisblok (basic block) is juist?
  4. Welk voorbeeld van constant folding in een compiler is juist?
  5. Welke transformatie is juist als in de bovenstaande lus strength reduction wordt toegepast op de indexberekening i * 4?
  6. Wat is het belangrijkste doel van loop blocking (tiling), zoals gebruikt bij matrixvermenigvuldiging?

Verwante termen

Basic block Numerieke apertuur (NA) Constant folding Via Strength reduction Loop blocking (tiling) Abstracte syntaxisboom (AST) Common subexpression elimination Control-flow-graaf (CFG) Inlining

Naar de woordenlijst