/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
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.
Rozwiń węzeł Właściwości konfiguracji węzła.
Rozwiń węzeł C i C++ węzła.
Wybierz języka stronę właściwości.
Modyfikowanie Obsługa OpenMP właściwości.
Aby programowo ustawić tę opcję kompilatora
- See OpenMP.
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);
}