/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 /openmpmetody , 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 przekazujesz /clr aplikację do narzędzia, takiego jak regasm.exe, który ł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

  1. 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).

  2. Rozwiń stronę właściwości>Właściwości konfiguracji C/C++>Language.

  3. Zmodyfikuj właściwość Obsługa protokołu OpenMP.

Aby programowo ustawić tę opcję kompilatora

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 /openmpdrugie 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