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];
- Ai * 4 vervangen door een tijdens het compileren berekende constante
- BHet aantal iteraties vermindert tot een vierde en de body wordt viermaal achter elkaar gezet
- 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.