/openmp (Aktivieren der OpenMP 2.0-Unterstützung)

Aktualisiert: November 2007

Veranlasst, dass der Compiler #pragmaomp verarbeitet.

/openmp

Hinweise

#pragma omp wird zur Festlegung von OpenMP Directives und OpenMP Clauses verwendet. Wenn /openmp in einer Kompilierung nicht angegeben ist, werden OpenMP-Klauseln und -Direktiven vom Compiler ignoriert. OpenMP-Funktionsaufrufe werden vom Compiler verarbeitet, auch wenn /openmp nicht angegeben ist.

Eine mit /openmp kompilierte Anwendung, die die OpenMP Libraries verwendet, kann nur unter Windows 2000 oder späteren Betriebssystemen ausgeführt werden.

Mit /openmp und /clr kompilierte Anwendungen können nur in einem einzelnen Anwendungsdomänenprozess ausgeführt werden. Mehrere Anwendungsdomänen werden nicht unterstützt. Bei Ausführung des Modulkonstruktors (.cctor) entdeckt dieser den mit /openmp kompilierten Prozess und ob die Anwendung in eine nicht standardmäßige Laufzeit geladen wird. Weitere Informationen finden Sie unter appdomain, /clr (Common Language Runtime-Kompilierung) und Initialisierung gemischter Assemblys.

Wenn Sie versuchen, eine mit /openmp und /clr kompilierte Anwendung in eine nicht standardmäßige Anwendungsdomäne zu laden, wird eine TypeInitializationException-Ausnahme außerhalb des Debuggers und eine OpenMPWithMultipleAppdomainsException-Ausnahme im Debugger ausgelöst.

Diese Ausnahmen können auch in den folgenden Situationen ausgelöst werden:

  • Wenn Ihre mit /clr, jedoch nicht mit /openmp kompilierte Anwendung in eine nicht standardmäßige Anwendungsdomäne geladen wird und der Prozess auch eine mit /openmp kompilierte Anwendung umfasst.

  • Wenn Sie die /clr-Anwendung an ein Dienstprogramm wie regasm.exe (Assembly Registration-Tool (Regasm.exe)) übergeben, das die Zielassemblys der Anwendung in eine nicht standardmäßige Anwendungsdomäne lädt.

Die Codezugriffssicherheit der Common Language Runtime funktioniert nicht in OpenMP-Bereichen. Wenn Sie ein CLR-Codezugriffssicherheitsattribut außerhalb eines parallelen Bereichs anwenden, ist es im parallelen Bereich nicht aktiv.

Microsoft empfiehlt, keine /openmp-Anwendungen zu schreiben, die teilweise vertrauenswürdigen Aufrufer zulassen, indem AllowPartiallyTrustedCallersAttribute oder beliebige andere CLR-Codezugriffssicherheitsattribute verwendet werden.

So legen Sie diese Compileroption in der Visual Studio-Entwicklungsumgebung fest

  1. Öffnen Sie das Dialogfeld Eigenschaftenseiten des Projekts. Ausführliche Informationen finden Sie unter Gewusst wie: Öffnen von Projekteigenschaftenseiten.

  2. Erweitern Sie den Knoten Konfigurationseigenschaften.

  3. Erweitern Sie den Knoten C/C++.

  4. Wählen Sie die Eigenschaftenseite Sprache aus.

  5. Ändern Sie die Eigenschaft OpenMP-Unterstützung.

So legen Sie diese Compileroption programmgesteuert fest

Beispiel

Das folgende Beispiel zeigt einige der Auswirkungen beim Threadpool-Start gegenüber der Verwendung von Threadpool nach dem Start. Bei einem x64-Single-Core-Dualprozessor dauert das Starten von Threadpool ca. 16 ms. Danach benötigt Threadpool jedoch nur sehr geringe Ressourcen.

Beim Kompilieren mit /openmp dauert der zweite Aufruf von test2 nie länger als beim Kompilieren mit /openmp-, da es keinen Threadpool-Start gibt. Bei einer Million Wiederholungen ist die /openmp-Version schneller als die /openmp--Version für den zweiten Aufruf von test2, bei 25 Wiederholungen verzeichnen sowohl die /openmp--Version als auch die /openmp-Version weniger als die Taktauflösung.

Wenn Sie daher nur eine Schleife in der Anwendung haben und sie in weniger als 15 ms ausgeführt wird (an den ungefähren Arbeitsspeicheraufwand auf dem Computer angepasst), ist /openmp möglicherweise nicht geeignet, umfasst die Anwendung jedoch mehr, sollten Sie die Verwendung von /openmp in Betracht ziehen.

// 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);
}

Siehe auch

Referenz

Compileroptionen

Festlegen von Compileroptionen