/openmp
(Povolení podpory OpenMP)
Způsobí, že kompilátor zpracovává #pragma omp
direktivy na podporu OpenMP.
Syntaxe
/openmp
/openmp:experimental
/openmp:llvm
/openmp
Poznámky
#pragma omp
slouží k určení direktiv a klauzulí. Pokud /openmp
není zadán v kompilaci, kompilátor ignoruje klauzule a direktivy OpenMP. Volání funkce OpenMP kompilátor zpracovává i v případě, že /openmp
není zadána.
Kompilátor C++ aktuálně podporuje standard OpenMP 2.0. Visual Studio 2019 teď také nabízí funkce SIMD. Pokud chcete použít SIMD, zkompilujte ji /openmp:experimental
pomocí této možnosti. Tato možnost povolí jak obvyklé funkce OpenMP, tak funkce OpenMP SIMD, které nejsou při použití /openmp
přepínače dostupné.
Počínaje sadou Visual Studio 2019 verze 16.9 můžete místo cílení na modul runtime OPENMP pro LLVM použít experimentální /openmp:llvm
možnost /openmp
. Podpora v současné době není k dispozici pro produkční kód, protože požadované knihovny DLL libomp nejsou distribuovatelné. Možnost podporuje stejné direktivy OpenMP 2.0 jako /openmp
. A podporuje všechny direktivy SIMD podporované možností /openmp:experimental
. Podporuje také celočíselné indexy bez znaménka paralelně pro smyčky podle standardu OpenMP 3.0. Další informace naleznete v tématu Vylepšená podpora OpenMP pro C++ v sadě Visual Studio.
Tato /openmp:llvm
možnost podporuje architekturu x64. Počínaje sadou Visual Studio 2019 verze 16.10 podporuje také architektury x86 a ARM64. Tato možnost není kompatibilní s /clr
nebo /ZW
.
Aplikace kompilované pomocí obou /openmp
aplikací a /clr
lze je spustit pouze v jednom procesu domény aplikace. Nepodporuje se více domén aplikací. To znamená, že při spuštění konstruktoru modulu (.cctor
) zjistí, jestli je proces zkompilován pomocí /openmp
, a pokud je aplikace načtena do jiného než výchozího modulu runtime. Další informace naleznete v tématu appdomain
, /clr
(Common Language Runtime Kompilace) a inicializace smíšených sestavení.
Pokud se pokusíte načíst aplikaci zkompilovanou pomocí /clr
/openmp
jiné než výchozí domény aplikace, TypeInitializationException vyvolá se výjimka mimo ladicí program a OpenMPWithMultipleAppdomainsException
v ladicím programu se vyvolá výjimka.
Tyto výjimky mohou být vyvolány také v následujících situacích:
Pokud je vaše aplikace zkompilována pomocí
/clr
, ale ne/openmp
a je načtena do jiné než výchozí domény aplikace, kde proces zahrnuje aplikaci zkompilovanou pomocí/openmp
.Pokud aplikaci
/clr
předáte nástroji, například regasm.exe, která načte cílová sestavení do jiné než výchozí domény aplikace.
Zabezpečení přístupu kódu modulu CLR (Common Language Runtime) v oblastech OpenMP nefunguje. Pokud použijete atribut zabezpečení přístupu kódu CLR mimo paralelní oblast, nebude platit v paralelní oblasti.
Microsoft nedoporučuje psát /openmp
aplikace, které umožňují částečně důvěryhodným volajícím. Nepoužívejte AllowPartiallyTrustedCallersAttributeani žádné atributy zabezpečení přístupu kódu CLR.
Nastavení tohoto parametru kompilátoru ve vývojovém prostředí Visual Studio
Otevřete dialogové okno Stránky vlastností projektu. Podrobnosti najdete v tématu Nastavení kompilátoru C++ a vlastností sestavení v sadě Visual Studio.
Rozbalte stránku vlastností vlastnosti konfigurace>C/C++>Language.
Upravte vlastnost Podpory OpenMP.
Programové nastavení tohoto parametru kompilátoru
- Viz třída OpenMP.
Příklad
Následující ukázka ukazuje některé účinky spuštění fondu vláken a použití fondu vláken po spuštění fondu vláken po jeho spuštění. Za předpokladu, že fond vláken x64, jednojádrový, duální procesor, trvá přibližně 16 ms, aby se spustil. Poté je pro fond vláken málo dalších poplatků.
Při kompilaci pomocí /openmp
, druhé volání test2 nikdy neběží déle, než když zkompilujete pomocí /openmp-
, protože neexistuje spuštění fondu vláken. Při milionech iterací /openmp
je verze rychlejší než /openmp-
verze druhého volání test2. Při 25 iteracích se obě /openmp-
verze /openmp
registrují méně než členitost hodin.
Pokud máte ve své aplikaci jenom jednu smyčku a běží za méně než 15 ms (upraveno pro přibližnou režii na vašem počítači), /openmp
nemusí být vhodné. Pokud je vyšší, můžete zvážit použití /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);
}
Viz také
Možnosti kompilátoru MSVC
Syntaxe příkazového řádku kompilátoru MSVC
OpenMP v MSVC