/openmp (Povolit podporu OpenMP 2.0)
Způsobí, že kompilátor zpracovat #pragmaomp.
/openmp
Poznámky
#pragma ompslouží k určení Direktivy jazyka OpenMP a OpenMP – klauzule.Pokud /openmp není zadána v sestavení, kompilátor ignoruje klauzule OpenMP a směrnic.Funkce OpenMP i když kompilátor zpracovává volání /openmp není zadána.
Aplikace je kompilována s /openmp a OpenMP – knihovny lze spustit pouze v systému Windows 2000 nebo novější operační systémy.
Aplikace je kompilována s /openmp a /clr lze spustit pouze v doméně proces jedné aplikace; není podporováno více aplikačními doménami.To znamená, že při spuštění modulu konstruktoru (.cctor) zjistí proces je kompilována s /openmp a pokud je aplikace načtena do jiné než výchozí runtime.Další informace naleznete v tématu appdomainm /clr (Common Language Runtime) a Inicializace smíšených sestavení.
Pokud se pokusíte načíst aplikaci kompilovanou s /openmp a /clr do domény aplikace jiné než výchozí, TypeInitializationException mimo ladicí program bude vyvolána výjimka a bude vyvolána výjimka OpenMPWithMultipleAppdomainsException v debuggeru.
Tyto výjimky mohou být vyvolány také v následujících situacích:
Pokud je aplikace kompilována s /clr, ale nikoli s /openmp, je načten do domény aplikace jiné než výchozí, ale pokud proces zahrnuje aplikaci, která byla zkompilována s /openmp.
Pokud předáte váš /clr aplikace nástroj, jako je například regasm.exe (Regasm.exe (nástroj registrace sestavení)), který jeho cíl sestavení načte do domény aplikace jiné než výchozí.
Zabezpečení přístupu kódu modulu common language runtime nefunguje v oblasti OpenMP.Pokud aplikujete CLR atribut zabezpečení přístupu kódu mimo paralelní region, nebude ve skutečnosti v oblasti paralelní.
Microsoft výzva, že nelze zapsat /openmp aplikace, které umožňuje částečně důvěryhodné volající, pomocí AllowPartiallyTrustedCallersAttribute, nebo všechny atributy zabezpečení přístupu kódu modulu CLR.
Chcete-li nastavit tuto možnost kompilátoru ve vývojovém prostředí Visual Studio
Otevřete dialogové okno projektu Stránky vlastností.Další informace naleznete v tématu Postupy: Otevření stránek vlastností projektu.
Rozbalte uzel Vlastnosti konfigurace.
Rozbalte uzel C/C++.
Vyberte jazyka stránky vlastností.
Změnit OpenMP podporu vlastnost.
Chcete-li tuto možnost kompilátoru nastavit v programu
- Další informace naleznete v tématu OpenMP.
Příklad
Následující příklad ukazuje některé z účinků při spuštění fondu podprocesů a kdy zachovalo po jeho spuštění.X 64, jednojádrový, za předpokladu, že má dva procesory zachovalo asi 16ms spuštění.Poté však není náklady zachovalo jen velmi málo.
Pokud kompilujete s /openmp, druhé volání test2 nikdy spouští déle, než pokud kompilujete s /openmp-, je bez spuštění fondu podprocesů.Na milión iterací /openmp je rychlejší než verze /openmp- verze pro druhé volání test2 a na 25 iterací /openmp- a /openmp registru verze nižší než rozlišovací schopnost hodiny.
Ano, pokud máte pouze jeden cyklus v aplikaci a spustí se v menší než 15ms (upravenou pro přibližné režie v počítači), /openmp nemusí být vhodné, ale pokud je více než cokoli, je vhodné 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);
}