Compilers

Welke transformatie is juist als in de bovenstaande lus strength reduction wordt toegepast op de indexberekening i * 4?

for (i = 0; i < n; i++)
    sum += a[i * 4];
  1. Ai * 4 vervangen door een tijdens het compileren berekende constante
  2. BHet aantal iteraties vermindert tot een vierde en de body wordt viermaal achter elkaar gezet
  3. CEen andere variabele aanmaken en bij elke iteratie er 4 bij optellen
Antwoord en toelichting tonen

Antwoord: C. Een andere variabele aanmaken en bij elke iteratie er 4 bij optellen

Strength reduction is een optimalisatie waarbij zware bewerkingen door lichtere worden vervangen. In plaats van i * 4 in de lus telkens met een vermenigvuldiging te bepalen, wordt met j = 0 begonnen en bij elke iteratie j += 4 uitgevoerd, zodat de vermenigvuldiging een optelling wordt. De waarde verandert telkens als i verandert, zodat vervanging door een constante niet mogelijk is. Ook vermenigvuldiging met 4 kan door een shift-instructie (i << 2) worden vervangen, wat ook een vorm van strength reduction is. Het achter elkaar zetten van de body is loop unrolling.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Compilers

  1. Wat is de belangrijkste reden dat de bovenstaande lus moeilijk te vectoriseren is met SIMD-instructies?
  2. Waarom kan de compiler in de bovenstaande functie de optimalisatie waarbij het lezen van *b buiten de lus wordt gebracht niet zonder meer uitvoeren?
  3. Welke combinatie van wat knopen en bogen voorstellen is juist bij de methode van het kleuren van een interferentiegraaf bij registertoewijzing in een compiler?
  4. Wat gebeurt er met de gegenereerde code als bij registertoewijzing een "spill" optreedt?
  5. Wat is het belangrijkste doel van instructieplanning (instruction scheduling) in een compiler?

Vergelijkingen bij dit onderwerp