/openmp (Activer la prise en charge OpenMP 2.0)

Mise à jour : novembre 2007

Demande au compilateur de traiter #pragmaomp.

/openmp

Notes

#pragma omp est utilisé pour spécifier OpenMP Directives et OpenMP Clauses. Si /openmp n'est pas spécifié dans une compilation, le compilateur ignore les clauses et directives OpenMP. Les appels à la fonction OpenMP sont traités par le compilateur même si /openmp n'est pas spécifié.

Une application compilée avec /openmp et qui utilise OpenMP Libraries peut être exécutée uniquement sur Windows 2000 ou les systèmes d'exploitation ultérieurs.

Les applications compilées avec /openmp et /clr ne peuvent être exécutées que dans un processus de domaine d'application unique ; l'utilisation de plusieurs domaines d'application n'est pas prise en charge. Ainsi, lorsque le constructeur de module (.cctor) est exécuté, il détecte que le processus est compilé avec /openmp et si l'application est chargée dans un runtime autre que celui par défaut. Pour plus d'informations, consultez appdomain, /clr (Compilation pour le Common Language Runtime) et Initialisation d'assemblys mixtes.

Si vous essayez de charger une application compilée avec /openmp et /clr dans un domaine d'application autre que celui par défaut, une exception TypeInitializationException est levée à l'extérieur du débogueur et une exception OpenMPWithMultipleAppdomainsException est levée dans le débogueur.

Ces exceptions peuvent également être levées dans les situations suivantes :

  • Si votre application compilée avec /clr, mais pas avec /openmp, est chargée dans un domaine d'application autre que celui par défaut dont le processus inclut une application compilée avec /openmp.

  • Si vous passez votre application /clr à un utilitaire, tel que regasm.exe (Outil Assembly Registration Tool (Regasm.exe)), qui charge ses assemblys cibles dans un domaine d'application autre que celui défini par défaut.

La sécurité d'accès du code du Common Language Runtime ne fonctionne pas dans les régions OpenMP. Si vous appliquez un attribut de sécurité d'accès du code du CLR à l'extérieur d'une région parallèle, il ne sera pas appliqué dans la région parallèle.

Microsoft recommande de ne pas écrire d'applications /openmp qui autorisent des appelants partiellement approuvés, l'utilisation de AllowPartiallyTrustedCallersAttribute ou tout attribut de sécurité d'accès du code du CLR.

Pour définir cette option du compilateur dans l'environnement de développement Visual Studio

  1. Ouvrez la boîte de dialogue Pages de propriété du projet. Pour plus d'informations, consultez Comment : ouvrir les pages de propriétés d'un projet.

  2. Développez le nœud Propriétés de configuration.

  3. Développez le nœud C/C++.

  4. Sélectionnez la page de propriétés Langue.

  5. Modifiez la propriété Prise en charge OpenMP.

Pour définir cette option du compilateur par programme

Exemple

L'exemple suivant illustre certains effets du démarrage d'un thread threadpool en comparaison avec l'utilisation du thread threadpool après son démarrage. Avec un biprocesseur x64 à noyau unique, le démarrage du thread threadpool dure environ 16 ms, Cependant, cela n'implique ensuite qu'un très faible coût pour le thread threadpool.

Lorsque vous compilez avec /openmp, le deuxième appel à test2 ne s'exécute jamais plus longtemps que lors d'une compilation avec /openmp-, car dans ce cas, aucun démarrage du thread threadpool ne se produit. À un million d'itérations, la version /openmp est plus rapide que la version /openmp- pour le deuxième appel à test2, et à 25 itérations, les versions /openmp- et /openmp offrent une précision inférieure à celle de l'horloge.

Par conséquent, si vous possédez une seule boucle dans votre application et si elle s'exécute en moins de 15 ms (ajusté pour les charges mémoire approximatives sur votre ordinateur), /openmp risque de ne pas être approprié, mais si vous disposez d'autres éléments, vous pouvez envisager d'utiliser /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);
}

Voir aussi

Référence

Options du compilateur

Définition des options du compilateur