Freigeben über


AUTO-Parallelisierung und AUTO-Vektorisierung

Automatische Parallelisierung und automatische Vektorisierung sind so konzipiert, dass automatische Leistungszuwachs für Schleifen im Code bereit.

Automatische Parallelisierung

Der /Qpar Compilerschalter aktiviert die automatische Parallelisierung von Schleifen im Code.Wenn Sie dieses Flag angeben, ohne den vorhandenen Code zu ändern, wertet der Compiler den Code aus, um Schleifen zu suchen, die möglicherweise für die Parallelisierung profitieren könnten.Da sie möglicherweise Schleifen findet, die nicht viel Arbeit ausführen und daher nicht für die Parallelisierung profitiert werden, und da jede unnötige Parallelisierung der Erstellung eines Threadpools Verarbeitungsaufwand, der zusätzliche Synchronisierung, oder der anderer erzeugen kann, die tendieren würde, Leistung Verlangsamung, anstatt sie zu verbessern, ist der Compiler konservativ ausgeführt, wenn die Schleifen auswählt, die er parallelisieren.Betrachten Sie beispielsweise das folgende Beispiel, in dem die Obergrenze der Schleife nicht zur Kompilierzeit bekannt:

void loop_test(int u) {
   for (int i=0; i<u; ++i)
      A[i] = B[i] * C[i];
}

Da u ein kleiner Wert sein könnte, parallelisiert der Compiler nicht automatisch diese Schleife.Sie sollten dennoch parallelisierten, da Sie wissen, dass u immer groß ist.Um die AUTOParallelisierung zu aktivieren, geben Sie #pragma - Schleife (hint_parallel (n)) an, in dem n die Anzahl der horizontal ist zu parallelisieren Threads.Im folgenden Beispiel versucht der Compiler, die Schleife über 8 Threads zu parallelisieren.

void loop_test(int u) {
#pragma loop(hint_parallel(8))
   for (int i=0; i<u; ++i)
      A[i] = B[i] * C[i];
}

Wie bei allen Pragma-Direktive, wird die alternative Pragmasyntax __pragma(loop(hint_parallel(n))) ebenfalls unterstützt.

Es gibt mehrere Schleifen, die der Compiler nicht parallelisieren kann, auch wenn Sie ihn möchten.Ein Beispiel:

#pragma loop(hint_parallel(8))
for (int i=0; i<upper_bound(); ++i)
    A[i] = B[i] * C[i];

Die Funktion upper_bound() kann sich jedes Mal, wenn sie aufgerufen hat.Da die Obergrenze nicht bekannt ist, kann der Compiler eine Diagnosemeldung ausgeben, die erklärt, warum diese Schleife nicht parallelisieren kann.Im folgenden Beispiel wird eine - Schleife, die parallelisiert werden kann, eine - Schleife, die nicht parallelisiert werden kann, die Compilersyntax, um an der Eingabeaufforderung zu verwenden und die Compilerausgabe für jede Befehlszeilenoption:

int A[1000];
void test() {
#pragma loop(hint_parallel(0))
    for (int i=0; i<1000; ++i) {
        A[i] = A[i] + 1;
    }

    for (int i=1000; i<2000; ++i) {
        A[i] = A[i] + 1;
    }
}

Kompilieren mithilfe dieses Befehls:

cl d:\myproject\mylooptest.cpp /O2 /Qpar /Qpar-report:1

führt Ausgaben dieses:

--- Analyzing function: void __cdecl test(void)
d:\myproject\mytest.cpp(4) : loop parallelized

Kompilieren mithilfe dieses Befehls:

cl d:\myproject\mylooptest.cpp /O2 /Qpar /Qpar-report:2

führt Ausgaben dieses:

--- Analyzing function: void __cdecl test(void)
d:\myproject\mytest.cpp(4) : loop parallelized
d:\myproject\mytest.cpp(4) : loop not parallelized due to reason '1008'

Beachten Sie den Unterschied in der Ausgabe zwischen den zwei verschiedenen /Qpar-report (Auto-Parallelizer Reporting Level) Optionen./Qpar-report:1 gibt Parallelisierungsmeldungen nur für Schleifen aus, die erfolgreich parallelisiert werden./Qpar-report:2 gibt Parallelisierungsmeldungen für die erfolgreiche und fehlgeschlagene Schleifenparallelisierungen aus.

Weitere Informationen zu Ursachencodes und Meldungen, finden Sie unter Vectorizer and Parallelizer Messages.

Automatische Vektorisierung

Die automatische Vektorisierung analysiert Schleifen im Code, und verwendet die Vektorregister und Anweisungen im Computer, sie auszuführen, wenn sie kann.Dies kann die Leistung des Codes verbessern.Der Compiler verwendet die Anweisungen SSE2-Anweisungen bei Intel oder im AMD-Prozessoren oder die NEONanweisungen auf ARMprozessoren an.Die automatische Vektorisierung auch verwendet, das später, die gefestgelegte Anweisung SSE4.2 wenn die Computerunterstützung es.

Standardmäßig ist die automatische Vektorisierung aktiviert.Wenn Sie die Leistung des Codes unter Vektorisierung vergleichen möchten, können Sie #pragma - Schleife (no_vector) verwenden, um Vektorisierung jeder angegebenen Schleife zu deaktivieren.

#pragma loop(no_vector)
for (int i = 0; i < 1000; ++i)
   A[i] = B[i] + C[i];

Wie bei allen Pragma-Direktive, wird die alternative Pragmasyntax __pragma(loop(no_vector)) ebenfalls unterstützt.

Wie bei der automatischen Parallelisierung, können Sie die /Qvec-report (Auto-Vectorizer Reporting Level) Befehlszeilenoption angeben, erfolgreich zu melden entweder vectorized Schleifen nur /Qvec-report:1- oder erfolgreich bzw. vectorized Schleifen /Qvec-report:2).

Weitere Informationen zu Ursachencodes und Meldungen, finden Sie unter Vectorizer and Parallelizer Messages.

Ein Beispiel, das veranschaulicht, wie die Vektorisierung in der Praxis funktioniert, finden Sie unter Projekt-Austin-Teil 2 von 6: Seiten-Winden

Siehe auch

Referenz

Schleife

/Qpar (Automatische Parallelisierung)

/Qpar-report (Auto-Parallelizer Reporting Level)

/Qvec-report (Auto-Vectorizer Reporting Level)

Weitere Ressourcen

Parallele Programmierung in systemeigenem Code

Vectorizer and Parallelizer Messages