Compiler
Welche Transformation ist richtig, wenn in der obigen Schleife auf die Indexberechnung i * 4 Strength Reduction angewendet wird?
for (i = 0; i < n; i++)
sum += a[i * 4];
- Ai * 4 wird durch eine zur Kompilierzeit berechnete Konstante ersetzt
- BDie Zahl der Iterationen wird auf ein Viertel verringert und der Rumpf viermal aneinandergereiht
- CEs wird eine weitere Variable angelegt, zu der in jeder Iteration 4 addiert wird
Antwort und Erläuterung anzeigen
Antwort: C. Es wird eine weitere Variable angelegt, zu der in jeder Iteration 4 addiert wird
Strength Reduction ist eine Optimierung, die aufwendige Operationen durch leichtere ersetzt. Statt i * 4 in der Schleife jedes Mal per Multiplikation zu bestimmen, wird mit j = 0 begonnen und in jeder Iteration j += 4 ausgeführt, sodass aus der Multiplikation eine Addition wird. Der Wert ändert sich mit i, daher kann er nicht durch eine Konstante ersetzt werden. Auch die Multiplikation mit 4 lässt sich durch einen Schiebebefehl (i << 2) ersetzen, was ebenfalls eine Form der Strength Reduction ist. Das Aneinanderreihen des Rumpfs ist Loop Unrolling.