/openmp (Włącz obsługę OpenMP 2.0)
Powoduje, że na kompilatorze przetworzenie #pragmaomp.
/openmp
Uwagi
#pragma ompSłuży do określania OpenMP — Dyrektywy i Klauzule OpenMP.Jeśli /openmp nie jest określona w kompilacji, kompilator ignoruje klauzul OpenMP i dyrektyw.Funkcja OpenMP połączeń są przetwarzane przez kompilator, nawet jeśli /openmp nie jest określony.
Skompilowana aplikacja z /openmp i za pomocą Biblioteki OpenMP może być uruchamiany tylko w systemie Windows 2000 lub nowszych systemach operacyjnych.
Aplikacje skompilowane 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 proces został skompilowany z /openmp i jeśli aplikacja jest ładowany do wykonywania innych niż domyślne.Aby uzyskać więcej informacji, zobacz appdomain, /clr (Kompilacja środowiska uruchomieniowego języka wspólnego), i Inicjalizacja zestawów mieszanych.
Jeśli użytkownik spróbuje załadować skompilowany z aplikacji /openmp i /clr do domeny aplikacji innej niż domyślna, TypeInitializationException będzie wyjątek poza debugera i wyjątek OpenMPWithMultipleAppdomainsException zostanie wygenerowany w debugerze.
Wyjątki te mogą również uruchamiany 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 gdy proces obejmuje aplikację, która została skompilowana z /openmp.
W przypadku przekazania Twój /clr aplikacji dla narzędzia, takich jak regasm.exe (Regasm.exe (Narzędzie rejestracji zestawów)), które ładuje zestawów jego miejsce docelowe do domeny aplikacji innych niż domyślne.
Zabezpieczenia dostępu do kodu języka wspólnego nie działa w regionach OpenMP.Jeśli stosuje się atrybut zabezpieczeń CLR kod dostępu poza regionem równolegle, nie będzie obowiązywać w regionie równoległych.
Microsoft informuje, że nie pisz /openmp aplikacji, które zezwala na częściowo zaufane obiekty wywołujące, za pomocą AllowPartiallyTrustedCallersAttribute, lub atrybutów zabezpieczeń dostępu do kodu CLR.
Aby ustawić tę opcję kompilatora w środowisku programowania Visual Studio
Otwórz okno dialogowe Strony właściwości projektu.Szczegółowe informacje – zobacz: Porady: otwieranie stron właściwości projektów.
Rozwiń węzeł Właściwości konfiguracji.
Rozwiń węzeł C/C++.
Wybierz języka strona właściwości.
Modyfikowanie Obsługa OpenMP właściwości.
Aby programowo ustawić tę opcję kompilatora
- Zobacz OpenMP.
Przykład
Następujący przykład przedstawia niektóre skutki uruchamiania pozostawiło w porównaniu z wykorzystaniem pozostawiło po jego uruchomieniu.Podwójny procesor pozostawiło x 64, pojedynczy rdzeń, zakładając, że trwa około 16 MS uruchamiania.Po tym jednak jest bardzo mało koszt dla puli wątków.
Przy kompilacji z /openmp, drugie wywołanie test2 nigdy nie działa dłużej niż kompilacja z /openmp-, ponieważ nie ma żadnych uruchomienia puli wątków.W iteracji miliona /openmp jest szybsze niż wersja /openmp- drugie wywołanie do test2 i przy 25 iteracji w wersji /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 (skorygowana o przybliżonej narzutów na tym komputerze), /openmp nie jest właściwe, ale jeśli jest to coś więcej niż ta, 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);
}