Udostępnij za pośrednictwem


Auto wykonywania i Auto Wektoryzacja

Auto-Parallelizer i Auto-Vectorizer mają zapewnić wzrost wydajności automatycznych dla pętli w kodzie.

Auto-Parallelizer

/Qpar umożliwia przełącznik kompilatora Automatyczne zrównolegleniu pętli w kodzie.Po określeniu tej flagi bez zmieniania istniejącego kodu, kompilator oblicza kod, aby znaleźć pętli, które mogą korzystać z zrównolegleniu.Ponieważ może odnaleźć pętli, które nie dużo pracy i dlatego nie będą korzystać z zrównolegleniu, a każdy zbędnych zrównolegleniu mogą powodować tarła z puli wątków, synchronizacja dodatkowych lub innych przetwarzania, które mogłoby spowodować spowolnienie działania zamiast jej poprawę, kompilator jest Konserwatywny przy wyborze pętli, które to parallelizes.Na przykład rozważmy następujący przykład, w którym górna granica pętli nie jest znany w czasie kompilacji:

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

Ponieważ u może być małej wartości, kompilator nie będzie automatycznie zrównoleglenia tej pętli.Jednak, nadal możesz ją parallelized, ponieważ wiadomo, że u zawsze mają bardzo duże rozmiary.Aby włączyć auto zrównoleglenia, należy określić #pragma loop(hint_parallel(n)), gdzie n to liczba wątków do zrównoleglenia całej.W poniższym przykładzie kompilator będzie próbował zrównoleglenia pętli całej 8 wątków.

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

Jak w przypadku dyrektywy pragma, składni alternatywnej pragma __pragma(loop(hint_parallel(n))) jest również obsługiwane.

Istnieje kilka pętli, które kompilator nie może zrównoleglają, nawet, jeśli chcesz go.Oto przykład:

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

Funkcja upper_bound() mogą ulec zmianie, za każdym razem, gdy to się nazywa.Ponieważ nie może być ujawniona górna granica, kompilator wyemitować komunikat diagnostyczny, który wyjaśnia, dlaczego nie można zrównoleglenia tej pętli.W poniższym przykładzie zademonstrowano pętlę, która może odbywać się równolegle, pętli, która nie może odbywać się równolegle, kompilator składni w wierszu polecenia, a dane wyjściowe kompilatora dla każdej z opcji wiersza polecenia:

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;
    }
}

Kompilowanie, za pomocą tego polecenia:

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

daje to Wyjście:

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

Kompilowanie, za pomocą tego polecenia:

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

daje to Wyjście:

--- 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'

Należy zauważyć różnicę w danych wyjściowych między dwóch różnych /Qpar-report (Auto-Parallelizer Reporting Level) opcje./Qpar-report:1Wyświetla komunikaty parallelizer tylko do obsługi pętli, które są pomyślnie parallelized./Qpar-report:2Wyświetla komunikaty parallelizer dla obu przypadek optymistyczny pętli udanych i nieudanych.

Aby uzyskać więcej informacji na temat kodów przyczyn i wiadomości, zobacz Vectorizer and Parallelizer Messages.

Auto-Vectorizer

Auto-Vectorizer analizuje pętle w kodzie i używa rejestrów wektorowych i instrukcje w komputerze do ich wykonania, jeżeli jest to możliwe.Może to zwiększyć wydajność kodu.Kompilator jest przeznaczony dla instrukcji SSE2 w procesorach firmy Intel lub AMD lub instrukcje NEON na procesorach ARM.Auto-Vectorizer używa również nowsze, zestawu, jeśli komputer obsługuje tę funkcję instrukcji SSE4.2.

Auto-Vectorizer jest domyślnie włączona.Jeśli chcesz porównać wydajność kodu na zasadach wektoryzacja, można użyć #pragma loop(no_vector) Aby wyłączyć wektoryzacja żadnych danej pętli.

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

Jak w przypadku dyrektywy pragma, składni alternatywnej pragma __pragma(loop(no_vector)) jest również obsługiwane.

Jak z Auto-Parallelizer, można określić /Qvec-report (Auto-Vectorizer Reporting Level) opcji wiersza polecenia, aby zgłosić albo pomyślnie wektorowy tylko pętli —/Qvec-report:1— lub zarówno pomyślnie i niepomyślnie wektorowy pętli —/Qvec-report:2).

Aby uzyskać więcej informacji na temat kodów przyczyn i wiadomości, zobacz Vectorizer and Parallelizer Messages.

Na przykład pokazujący, jak działa vectorizer w praktyce, zobacz projektu Austin część 2 z 6: strona Curling

Zobacz też

Informacje

loop

/ Qpar (Auto-Parallelizer)

/Qpar-report (Auto-Parallelizer Reporting Level)

/Qvec-report (Auto-Vectorizer Reporting Level)

Inne zasoby

Programowanie w kodzie macierzystym równoległe

Vectorizer and Parallelizer Messages