Vektorisierung bedeutet in einfachen Worten, den Algorithmus so zu optimieren, dass er SIMD-Anweisungen in den Prozessoren verwenden kann.
AVX, AVX2 und AVX512 sind die Befehlssätze (Intel), die dieselbe Operation für mehrere Daten in einem Befehl ausführen. für zB. AVX512 bedeutet, dass Sie jeweils 16 Ganzzahlwerte (4 Byte) bearbeiten können. Dies bedeutet, dass Sie, wenn Sie einen Vektor mit 16 Ganzzahlen haben und diesen Wert in jeder Ganzzahl verdoppeln und dann 10 hinzufügen möchten. Sie können entweder 16-mal Werte in das allgemeine Register [a, b, c] laden und dieselbe Operation ausführen, oder Sie können dieselbe Operation ausführen, indem Sie alle 16 Werte in SIMD-Register [xmm, ymm] laden und die Operation einmal ausführen. Dies beschleunigt die Berechnung von Vektordaten.
Bei der Vektorisierung nutzen wir dies zu unserem Vorteil, indem wir unsere Daten so umgestalten, dass wir SIMD-Operationen daran ausführen und das Programm beschleunigen können.
Das einzige Problem bei der Vektorisierung sind die Handhabungsbedingungen. Weil Bedingungen den Ausführungsfluss verzweigen. Dies kann durch Maskieren erfolgen. Durch Modellieren der Bedingung in eine arithmetische Operation. z.B. Wenn wir 10 zum Wert hinzufügen möchten, wenn er größer als 100 ist, können wir dies auch.
if(x[i] > 100) x[i] += 10; // this will branch execution flow.
oder wir können die Bedingung in eine arithmetische Operation modellieren, wobei ein Bedingungsvektor c erzeugt wird.
c[i] = x[i] > 100; // storing the condition on masking vector
x[i] = x[i] + (c[i] & 10) // using mask
Dies ist jedoch ein sehr triviales Beispiel. Daher ist c unser Maskierungsvektor, mit dem wir eine binäre Operation basierend auf ihrem Wert ausführen. Dies vermeidet eine Verzweigung des Ausführungsflusses und ermöglicht eine Vektorisierung.
Vektorisierung ist genauso wichtig wie Parallelisierung. Daher sollten wir es so weit wie möglich nutzen. Alle modernen Prozessoren verfügen über SIMD-Anweisungen für hohe Rechenauslastungen. Wir können unseren Code für die Verwendung dieser SIMD-Anweisungen mithilfe der Vektorisierung optimieren. Dies ähnelt der Parallelisierung unseres Codes für die Ausführung auf mehreren Kernen, die auf modernen Prozessoren verfügbar sind.
Ich möchte mit der Erwähnung von OpenMP gehen, mit dem Sie den Code mit Pragmas vektorisieren können. Ich halte es für einen guten Ausgangspunkt. Gleiches gilt für OpenACC.