Compiler

Was ist der Hauptgrund, warum sich die obige Schleife mit SIMD-Befehlen schwer vektorisieren lässt?

for (i = 1; i < n; i++)
    a[i] = a[i - 1] + b[i];
  1. ADas Ergebnis a[i-1] der vorherigen Iteration wird benötigt, sodass nicht gleichzeitig berechnet werden kann
  2. BDie Elemente des Arrays sind Ganzzahlen, die mit SIMD-Befehlen nicht berechnet werden können
  3. CWenn die Iterationszahl n zur Kompilierzeit nicht bekannt ist, ist Vektorisierung grundsätzlich unmöglich
Antwort und Erläuterung anzeigen

Antwort: A. Das Ergebnis a[i-1] der vorherigen Iteration wird benötigt, sodass nicht gleichzeitig berechnet werden kann

Bei der Vektorisierung werden z. B. die Berechnungen von vier Elementen mit einem SIMD-Befehl gleichzeitig ausgeführt. In dieser Schleife wird für a[i] das Ergebnis des vorherigen a[i-1] benötigt, sodass a[1] bis a[4] nicht gleichzeitig berechnet werden können. Bei einer solchen iterationsübergreifenden Abhängigkeit (Loop-Carried Dependence) ist eine Vektorisierung so nicht möglich. Auch Ganzzahlen lassen sich mit SIMD berechnen, und wenn die Iterationszahl erst zur Laufzeit feststeht, lässt sich durch gesonderte Behandlung des Rests dennoch vektorisieren.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Compiler

  1. Warum kann der Compiler in der obigen Funktion die Optimierung, das Lesen von *b aus der Schleife herauszuziehen, nicht ohne Weiteres durchführen?
  2. 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?
  3. Was geschieht mit dem erzeugten Code, wenn bei der Registerzuteilung ein „Spill“ auftritt?
  4. Was ist das Hauptziel der Befehlsplanung (Instruction Scheduling) des Compilers?
  5. Welche Wirkung hat es, wenn auf den letzten rekursiven Aufruf der obigen Funktion die Tail-Call-Optimierung angewendet wird?

Vergleiche zu diesem Thema