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];
  1. Ai * 4 wird durch eine zur Kompilierzeit berechnete Konstante ersetzt
  2. BDie Zahl der Iterationen wird auf ein Viertel verringert und der Rumpf viermal aneinandergereiht
  3. 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.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Compiler

  1. Was ist der Hauptgrund, warum sich die obige Schleife mit SIMD-Befehlen schwer vektorisieren lässt?
  2. Warum kann der Compiler in der obigen Funktion die Optimierung, das Lesen von *b aus der Schleife herauszuziehen, nicht ohne Weiteres durchführen?
  3. Welche Kombination dessen, was Knoten und Kanten darstellen, ist richtig, wenn bei der Registerzuteilung des Compilers das Verfahren der Färbung des Interferenzgraphen verwendet wird?
  4. Was geschieht mit dem erzeugten Code, wenn bei der Registerzuteilung ein „Spill“ auftritt?
  5. Was ist das Hauptziel der Befehlsplanung (Instruction Scheduling) des Compilers?

Vergleiche zu diesem Thema