Sdílet prostřednictvím


/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 /openmpa 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

  1. Otevřete dialogové okno Stránky vlastností projektu. Podrobnosti najdete v tématu Nastavení kompilátoru C++ a vlastností sestavení v sadě Visual Studio.

  2. Rozbalte stránku vlastností vlastnosti konfigurace>C/C++>Language.

  3. Upravte vlastnost Podpory OpenMP.

Programové nastavení tohoto parametru kompilátoru

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