/openmp
(Włącz obsługę protokołu OpenMP)
Powoduje, że kompilator przetwarza #pragma omp
dyrektywy w obsłudze protokołu OpenMP.
Składnia
/openmp
/openmp:experimental
/openmp:llvm
/openmp
Uwagi
#pragma omp
służy do określania dyrektyw i klauzul. Jeśli /openmp
kompilacja nie zostanie określona, kompilator ignoruje klauzule i dyrektywy OpenMP. Wywołania funkcji OpenMP są przetwarzane przez kompilator, nawet jeśli /openmp
nie zostanie określony.
Kompilator języka C++ obsługuje obecnie standard OpenMP 2.0. Program Visual Studio 2019 oferuje również funkcje SIMD. Aby użyć simD, skompiluj /openmp:experimental
przy użyciu opcji . Ta opcja włącza zarówno zwykłe funkcje OpenMP, jak i funkcje OpenMP SIMD niedostępne podczas korzystania z przełącznika /openmp
.
Począwszy od programu Visual Studio 2019 w wersji 16.9, możesz użyć opcji eksperymentalnej /openmp:llvm
zamiast /openmp
kierować do środowiska uruchomieniowego LLVM OpenMP. Obecnie obsługa nie jest dostępna dla kodu produkcyjnego, ponieważ wymagane biblioteki DLL libomp nie są redystrybucyjne. Opcja obsługuje te same dyrektywy OpenMP 2.0 co /openmp
. Obsługuje ona wszystkie dyrektywy SIMD obsługiwane przez /openmp:experimental
tę opcję. Obsługuje również niepodpisane indeksy całkowite równolegle dla pętli zgodnie ze standardem OpenMP 3.0. Aby uzyskać więcej informacji, zobacz Ulepszona obsługa protokołu OpenMP dla języka C++ w programie Visual Studio.
Opcja /openmp:llvm
obsługuje architekturę x64. Począwszy od programu Visual Studio 2019 w wersji 16.10, obsługuje również architektury x86 i ARM64. Ta opcja nie jest zgodna z /clr
programem lub /ZW
.
Aplikacje kompilowane przy użyciu obu /openmp
metod i /clr
mogą być uruchamiane tylko w ramach pojedynczego procesu domeny aplikacji. Wiele domen aplikacji nie jest obsługiwanych. Oznacza to, że gdy konstruktor modułu (.cctor
) jest uruchamiany, wykrywa, czy proces jest kompilowany przy użyciu /openmp
metody , a jeśli aplikacja jest ładowana do środowiska uruchomieniowego innego niż domyślne. Aby uzyskać więcej informacji, zobacz appdomain
,/clr
(Kompilacja środowiska uruchomieniowego języka wspólnego) i Inicjowanie zestawów mieszanych.
Jeśli próbujesz załadować aplikację skompilowana przy użyciu zarówno domeny, jak /openmp
i /clr
w domenie aplikacji innej niż domyślna, TypeInitializationException wyjątek zostanie zgłoszony poza debugerem, a OpenMPWithMultipleAppdomainsException
w debugerze zostanie zgłoszony wyjątek.
Te wyjątki można również zgłaszać w następujących sytuacjach:
Jeśli aplikacja jest kompilowana przy użyciu elementu
/clr
, ale nie/openmp
, i jest ładowana do domeny aplikacji innej niż domyślna, w której proces obejmuje aplikację skompilowana przy użyciu polecenia/openmp
.Jeśli przekażesz
/clr
aplikację do narzędzia, takiego jak regasm.exe, które ładuje zestawy docelowe do domeny aplikacji innej niż domyślna.
Zabezpieczenia dostępu do kodu środowiska uruchomieniowego języka wspólnego nie działają w regionach OpenMP. Jeśli zastosujesz atrybut zabezpieczeń dostępu do kodu CLR poza regionem równoległym, nie będzie on obowiązywać w regionie równoległym.
Firma Microsoft nie zaleca pisania /openmp
aplikacji, które zezwalają na częściowo zaufane osoby wywołujące. Nie używaj AllowPartiallyTrustedCallersAttributeatrybutów zabezpieczeń dostępu do kodu CLR ani .
Aby ustawić tę opcję kompilatora w środowisku programowania Visual Studio
Otwórz okno dialogowe Strony właściwości projektu. Aby uzyskać szczegółowe informacje, zobacz Set C++ compiler and build properties in Visual Studio (Ustawianie właściwości kompilatora języka C++ i kompilowania w programie Visual Studio).
Rozwiń stronę właściwości>Właściwości konfiguracji C/C++>Language.
Zmodyfikuj właściwość Obsługa protokołu OpenMP.
Aby programowo ustawić tę opcję kompilatora
- Zobacz: OpenMP.
Przykład
Poniższy przykład przedstawia niektóre efekty uruchamiania puli wątków w porównaniu z użyciem puli wątków po rozpoczęciu. Przy założeniu, że procesor x64, jeden rdzeń, podwójny procesor, pula wątków zajmuje około 16 ms do uruchomienia. Następnie pula wątków kosztuje niewiele dodatkowych kosztów.
Podczas kompilowania przy użyciu metody /openmp
drugie wywołanie do testu2 nigdy nie jest uruchamiane dłużej niż w przypadku kompilacji przy użyciu metody /openmp-
, ponieważ nie ma uruchamiania puli wątków. W milionach /openmp
iteracji wersja jest szybsza niż /openmp-
wersja dla drugiego wywołania test2. W 25 iteracji, zarówno, jak /openmp-
i /openmp
wersje rejestrują mniej niż stopień szczegółowości zegara.
Jeśli masz tylko jedną pętlę w aplikacji i działa w mniej niż 15 ms (dostosowane do przybliżonego obciążenia na maszynie), /openmp
może nie być odpowiednie. Jeśli jest ona wyższa, warto rozważyć użycie elementu /openmp
.
// cpp_compiler_options_openmp.cpp
#include <omp.h>
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
volatile DWORD dwStart;
volatile int global = 0;
double test2(int num_steps) {
int i;
global++;
double x, pi, sum = 0.0, step;
step = 1.0 / (double) num_steps;
#pragma omp parallel for reduction(+:sum) private(x)
for (i = 1; i <= num_steps; i++) {
x = (i - 0.5) * step;
sum = sum + 4.0 / (1.0 + x*x);
}
pi = step * sum;
return pi;
}
int main(int argc, char* argv[]) {
double d;
int n = 1000000;
if (argc > 1)
n = atoi(argv[1]);
dwStart = GetTickCount();
d = test2(n);
printf_s("For %d steps, pi = %.15f, %d milliseconds\n", n, d, GetTickCount() - dwStart);
dwStart = GetTickCount();
d = test2(n);
printf_s("For %d steps, pi = %.15f, %d milliseconds\n", n, d, GetTickCount() - dwStart);
}
Zobacz też
Opcje kompilatora MSVC
Składnia wiersza polecenia kompilatora MSVC
OpenMP w MSVC