Compiler

Welche Berechnung in der obigen Schleife ist Ziel der Verschiebung von schleifeninvarianten Ausdrücken (Loop-Invariant Code Motion, aus der Schleife heraus)? (x und y werden in der Schleife nicht verändert.)

for (i = 0; i < n; i++)
    a[i] = b[i] * (x * y);
  1. Ab[i] * (x * y) insgesamt
  2. Bx * y
  3. CDie Zuweisung an a[i]
Antwort und Erläuterung anzeigen

Antwort: B. x * y

Die Verschiebung schleifeninvarianter Ausdrücke ist eine Optimierung, bei der Berechnungen, die in jeder Iteration denselben Wert liefern, vor die Schleife gezogen und nur einmal berechnet werden. Da x und y sich in der Schleife nicht ändern, ist x * y in jeder Iteration gleich, und t = x * y kann vor der Schleife berechnet und a[i] = b[i] * t verwendet werden. b[i] ist für jedes i verschieden, daher kann b[i] * (x * y) insgesamt nicht verschoben werden. Auch die Zuweisung an a[i] schreibt in jeder Iteration ein anderes Element und bleibt in der Schleife.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Compiler

  1. Welche Transformation ist richtig, wenn in der obigen Schleife auf die Indexberechnung i * 4 Strength Reduction angewendet wird?
  2. Was ist der Hauptgrund, warum sich die obige Schleife mit SIMD-Befehlen schwer vektorisieren lässt?
  3. Warum kann der Compiler in der obigen Funktion die Optimierung, das Lesen von *b aus der Schleife herauszuziehen, nicht ohne Weiteres durchführen?
  4. 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?
  5. Was geschieht mit dem erzeugten Code, wenn bei der Registerzuteilung ein „Spill“ auftritt?

Vergleiche zu diesem Thema