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];
- ADas Ergebnis a[i-1] der vorherigen Iteration wird benötigt, sodass nicht gleichzeitig berechnet werden kann
- BDie Elemente des Arrays sind Ganzzahlen, die mit SIMD-Befehlen nicht berechnet werden können
- 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.