Frage

Ich bin jetzt schon mehrmals auf diesen Begriff in Matlab, Fortran gestoßen ...manch andere ...aber ich habe nie eine Erklärung gefunden, was es bedeutet und was es bewirkt?Ich frage hier also, was Vektorisierung ist und was es beispielsweise bedeutet, dass „eine Schleife vektorisiert wird“?

War es hilfreich?

Lösung

Viele CPUs haben „Vektor“ oder „SIMD“ Befehlssätze, die die gleiche Operation gleichzeitig auf zwei, vier oder mehr Teile von Daten anzuwenden. Moderne x86-Chips, die SSE-Befehle haben, haben viele PPC-Chips die „AltiVec“ Anweisungen und haben sogar einige ARM-Chips einen Vektor-Befehlssatz, die so genannte NEON.

„Vektorisierung“ (vereinfacht) ist der Prozess eine Schleife des Neuschreibens so dass anstelle der Verarbeitung eines einzelnen Elements eines Arrays N mal, es (beispielsweise) 4 Elemente des Arrays verarbeitet gleichzeitig N / 4-mal.

(Ich wählte 4, weil es ist, was moderne Hardware höchstwahrscheinlich direkt unterstützen; der Begriff „Vektorisierung“ wird auch eine höhere Software-Transformation zu beschreiben, wo man vielleicht nur abstrakt die Schleife ganz weg und nur Betrieb beschreibt auf Arrays statt die Elemente, die sie enthalten)


Der Unterschied zwischen Vektorisierung und Schleifenentrollen: Betrachten Sie die folgende sehr einfache Schleife, die die Elemente von zwei Arrays addiert und speichert die Ergebnisse in einer dritten Matrix.

for (int i=0; i<16; ++i)
    C[i] = A[i] + B[i];

Dieses Schleifenentrollen es in so etwas wie diese verwandeln würde:

for (int i=0; i<16; i+=4) {
    C[i]   = A[i]   + B[i];
    C[i+1] = A[i+1] + B[i+1];
    C[i+2] = A[i+2] + B[i+2];
    C[i+3] = A[i+3] + B[i+3];
}

Vektorisieren es, auf der anderen Seite erzeugt so etwas wie folgt aus:

for (int i=0; i<16; i+=4)
    addFourThingsAtOnceAndStoreResult(&C[i], &A[i], &B[i]);

Wo „addFourThingsAtOnceAndStoreResult“ ist ein Platzhalter für was auch immer intrinsische (n) Ihre Compiler Vektorbefehle geben verwendet. Beachten Sie, dass einige Compiler sind in der Lage zu auto vectorize sehr einfache Schleifen wie diese, die oft über eine Kompilierung-Option aktiviert werden. Komplexere Algorithmen noch Hilfe vom Programmierer erfordert eine guten Vektor-Code zu generieren.

Andere Tipps

Vektorisierung ist der Begriff für einen Skalar Programm zu einem Vektor-Programm zu konvertieren. Vektorisiert Programme können mehrere Operationen von einem einzelnen Befehl ausführen, während Skalar nur auf Paare von Operanden auf einmal arbeiten kann.

wikipedia :

Scalar Ansatz:

for (i = 0; i < 1024; i++)
{
   C[i] = A[i]*B[i];
}

Vectorized Ansatz:

for (i = 0; i < 1024; i+=4)
{
   C[i:i+3] = A[i:i+3]*B[i:i+3];
}

Es bezieht sich auf ein die Fähigkeit, einzelne mathematische Operation auf einer Liste zu tun - oder „Vektor“ - von Zahlen in einem einzigen Schritt. Sie sehen es oft mit Fortran, weil das mit wissenschaftlichem Rechnen zugeordnet ist, die mit Supercomputer verbunden ist, wo vektorisiert Arithmetik zum ersten Mal erscheint. Heutzutage fast alle Desktop-CPUs bieten irgendeine Form von vektorisiert Arithmetik, durch Technologien wie Intels SSE. GPUs bietet auch eine Form von vektorisiert Arithmetik.

Vektorisierung wird häufig im wissenschaftlichen Rechnen eingesetzt, wo große Datenmengen effizient verarbeitet werden müssen.

Ich weiß, dass es in einer echten Programmieranwendung in NUMPY verwendet wird (bei anderen bin ich mir nicht sicher).

Numpy (Paket für wissenschaftliches Rechnen in Python), verwendet Vektorisierung für eine schnelle Bearbeitung von n-dimensionalen Arrays, die im Allgemeinen langsamer ist, wenn sie mit integrierten Python-Optionen für die Handhabung von Arrays durchgeführt wird.

Obwohl es jede Menge Erklärungen gibt, HIER IST WAS VEKTORISIERUNG IST DEFINIERT WIE IN NUMPY-DOKUMENTATIONSSEITE

Unter Vektorisierung versteht man das Fehlen expliziter Schleifen, Indizierungen usw. im Code – diese Dinge finden natürlich nur „hinter den Kulissen“ in optimiertem, vorkompiliertem C-Code statt.Vektorisierter Code bietet viele Vorteile, darunter:

  1. Vektorisierter Code ist prägnanter und leichter zu lesen

  2. Weniger Codezeilen bedeuten im Allgemeinen weniger Fehler

  3. Der Code ähnelt eher der mathematischen Notation der Standard -Notation (machte es in der Regel einfacher, mathematische Konstrukte korrekt zu codieren)

  4. Die Vektorisierung führt zu mehr „Python“-Code.Ohne Vektorisierung wäre unser Code mit ineffizienten und schwer zu lesen für Schleifen übersät.

Vektorisierung, in einfachen Worten bedeutet den Algorithmus zu optimieren, so dass es SIMD-Befehle in den Prozessoren nutzen kann.

AVX, AVX2 und AVX512 sind die Befehlssätze (Intel), die in einem Befehl an mehreren Daten gleiche Operation durchzuführen. für zB. AVX512 bedeutet, dass Sie auf 16 ganzzahlige Werte (4 Bytes) zu einer Zeit betrieben werden kann. Was das bedeutet ist, dass, wenn Sie Vektor von 16 Zahlen, und Sie wollen diesen Wert in jeder ganzen Zahlen verdoppeln und dann 10, um es hinzuzufügen. Sie können entweder Belastungswerte auf dem allgemeinen Register [a, b, c] 16 Mal und gleiche Operation durchführen oder Sie können durch das Laden alle 16 Werte auf gleiche Operation durchführen, um SIMD [xmm, ymm] registriert und den Vorgang einmal durchzuführen. Auf diese Weise kann die Berechnung von Vektordaten beschleunigen.

In Vektorisierung verwenden wir dies zu unserem Vorteil, durch unsere Daten Umbau, so dass wir SIMD-Operationen darauf ausführen können und das Programm beschleunigen.

Das einzige Problem mit Vektorisierung ist Bedingungen Handhabung. Weil die Bedingungen den Ablauf der Ausführung verzweigen. Dies kann durch eine Maskierung behandelt werden. Durch die Bedingung in eine arithmetische Operation zu modellieren. z.B. wenn wir hinzufügen 10 Wert wollen, wenn er größer ist dann 100. wir können auch nicht.

if(x[i] > 100) x[i] += 10; // this will branch execution flow.

oder wir können den Zustand in arithmetischer Operation modellieren einen Zustandsvektor c Erstellen

c[i] = x[i] > 100; // storing the condition on masking vector
x[i] = x[i] + (c[i] & 10) // using mask

Das ist sehr triviales Beispiel wenn ... also, c unser Maskierungsvektor ist, die wir binäre Operation ausführen verwenden, um basierend auf ihrem Wert. Dies zu vermeiden Verzweigung von Ausführungsablauf und ermöglicht die Vektorisierung.

Vektorisierung ist ebenso wichtig wie Parallelisierung. Daher sollten wir Gebrauch davon, so viel möglich machen. Alle modernen Tage Prozessoren haben SIMD-Befehle für schwere Rechen Workloads. Wir können unseren Code optimieren diese SIMD-Befehle mit Vektorisierung zu verwenden, ist dies ähnlich unseren Code parrallelizing auf mehrere Kerne auf modernen Prozessoren laufen.

Ich möchte mit der Erwähnung von OpenMP verlassen, die yo pragmas vektorisiert den Code mit lässt. Ich betrachte es als ein guter Ausgangspunkt. Gleiches gilt für die OpenACC gesagt werden.

Sehen Sie zwei Antworten oben. Ich wollte nur hinzufügen, dass der Grund für den Wunsch Vektorisierung zu tun, ist, dass diese Operationen leicht in paraell von Supercomputern und Multiprozessoren durchgeführt werden können, eine große Leistungssteigerung ergeben. Auf einzelnen Prozessor-Computern gibt es keine Performance-Gewinn sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top