Udostępnij za pośrednictwem


/openmp (Włącz OpenMP 2.0 obsługa)

Powoduje, że kompilator przetwarza #pragmaOMP.

/openmp

Uwagi

#pragma ompSłuży do określania Dyrektyw OpenMP i Klauzule OpenMP.Jeśli /openmp nie jest określony w kompilacji, kompilator ignoruje klauzul OpenMP i dyrektyw.Funkcja OpenMP połączeń są przetwarzane przez kompilator nawet wtedy, gdy /openmp nie jest określony.

Skompilowana aplikacja, z /openmp i za pomocą Biblioteki OpenMP można uruchamiać tylko w systemie Windows 2000 lub nowszych systemach operacyjnych.

Aplikacje opracowane z /openmp i /clr może być uruchamiany tylko w procesie domeny pojedynczej aplikacji; wiele domen aplikacji nie są obsługiwane.Oznacza to, że po uruchomieniu modułu Konstruktor (.cctor) wykryje procesu została skompilowana z /openmp i jeśli aplikacja jest ładowane do wykonywania innych niż domyślne.Aby uzyskać więcej informacji, zobacz elementu AppDomain, / CLR (kompilacja wspólnej Language Runtime), i Inicjowanie mieszanych zestawów.

Jeśli próba załadowania aplikacji skompilowany z /openmp i /clr do domeny aplikacji innych niż domyślne, TypeInitializationException będzie wyjątek poza debugera i wygeneruje wyjątek OpenMPWithMultipleAppdomainsException w debugerze.

Wyjątki te również może być podniesiony w następujących sytuacjach:

  • Jeśli aplikacja skompilowane z /clr, ale nie z /openmp, jest ładowany do domeny aplikacji innych niż domyślne, ale w którym proces obejmuje aplikację, która została skompilowana z /openmp.

  • Jeśli przekażemy Twoje /clr stosowania narzędzi takich jak regasm.exe (Regasm.exe (narzędzie do rejestracji zestawu)), który ładuje swoje zestawy docelowe do domeny aplikacji innych niż domyślne.

Wykonywalnych języka wspólnego kodu dostępu zabezpieczeń nie działa w regionach OpenMP.Jeśli stosuje się atrybut zabezpieczeń dostępu kodu CLR poza regionem równolegle, nie będzie w mocy w regionie równolegle.

Microsoft doradza się, że nie zapisywać /openmp aplikacji, które zezwala na częściowo zaufane obiekty wywołujące, za pomocą AllowPartiallyTrustedCallersAttribute, lub wszystkie atrybuty zabezpieczeń CLR kod dostępu.

Aby ustawić tę opcję kompilatora w środowisku projektowym programu Visual Studio

  1. Otwórz projekt Stron właściwości okno dialogowe.Aby uzyskać szczegółowe informacje, zobacz Jak: Otwórz strony właściwości projektu.

  2. Rozwiń węzeł Właściwości konfiguracji węzła.

  3. Rozwiń węzeł C i C++ węzła.

  4. Wybierz języka stronę właściwości.

  5. Modyfikowanie Obsługa OpenMP właściwości.

Aby programowo ustawić tę opcję kompilatora

Przykład

Poniżej przedstawiono przykładowe niektórych efektów uruchomienia puli wątków kontra przy użyciu puli wątków, po jego uruchomienia.Podwójny procesor pozostawiło przy założeniu x 64, rdzeń, zajmuje około 16 MS uruchamiania.Po tym, że chociaż istnieje bardzo małym kosztem dla puli wątków.

Podczas kompilacji z /openmp, drugie wywołanie test2 nigdy nie działa dłużej niż kompilowania z /openmp-, nie ma żadnych Autostart puli wątków.Na milion iteracji /openmp jest szybsze niż wersja /openmp- wersji dla drugiego wywołania do test2 i na 25 iteracji /openmp- i /openmp wersji rejestru mniej niż ziarnistość zegara.

Tak, jeśli masz tylko jeden pętli w aplikacji i działa w mniej niż 15 MS (dostosowane do przybliżonej narzutów na komputerze), /openmp nie jest właściwe, ale jeśli jest coś więcej niż warto rozważyć użycie /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ż

Informacje

Opcje kompilatora

Ustawianie opcji kompilatora