2009-08-31 5 views
3

Dans mon programme C++, je voudrais exécuter son exécutable parfois avec et parfois sans utiliser OpenMP (c'est-à-dire multi-threading ou single-threading). Je considère l'un des deux cas suivants comment mon code utilise OpenMP:Désactiver OpenMP

(1) Supposons que mon code n'a que des directives #include <omp.h> et OpenMP.

(2) Identique à (1) et mon code appelle en outre des fonctions OpenMP comme omp_get_thread_num().

Afin de ne pas avoir un code différent pour une exécution différente, est-ce le seul moyen d'utiliser une variable de précompilateur auto-définie à garder où OpenMP apparaît dans mon code?

Merci pour votre intérêt!

Répondre

2

Salut la meilleure façon de le faire est

omp_set_num_threads(m_iUseableProcessors); 

où m_iUseableProcessors est le nombre de processeurs que vous voulez diviser le calcul. Je ne sais pas comment le faire sans les fonctions OpenMP. Vous pourriez probablement les #ifdef, mais cela vous fait désactiver OpenMP au moment de la compilation.

9

Vous pouvez utiliser la variable d'environnement:

set OMP_NUM_THREADS=1 

En fait, il ne tourne pas OpenMP hors tension. Cela forcera OpenMP à créer un seul thread pour une application. Cela fonctionne sans recompilation. J'utilise cette variable pour tester l'évolutivité sur les threads 1, 2, 3, 4 etc.

3

Vous pouvez mettre le comprennent comme suit:

#ifdef _OPENMP_ 
#include<omp.h> 
#endif 

Maintenant, si vous exécutez votre programme sans drapeau -fopenmp, il ne tiendrait pas compte des directives OpenMP

+1

Dans VS2010, la macro est "\ _OPENMP" et non "\ _OPENMP \ _" –

0

En plus de la suggestion de _OPENMP, vous trouverez peut-être il est utile d'utiliser le code _Pragma de C99 (ou __pragma, si vous utilisez des compilateurs C++ - voir this StackOverflow question pour plus de détails) pour éviter que votre code ne soit jonché de #ifdef _OPENMP et #endif, réduisant ainsi les lignes associées à la compilation conditionnelle par 3x, et sinon vous donner le contrôle O (1) sur O (n) instances d'annotations OpenMP. Par exemple, j'utilise le style suivant dans mes codes CMP OpenMP. Les modifications pour prendre en charge C++ devraient être assez modestes, bien que probablement spécifiques au compilateur (dans ce cas, des macros comme __GNUC__, __clang__, __INTEL_COMPILER, etc. peuvent être utiles).

#ifndef PRAGMA_OPENMP_H 
#define PRAGMA_OPENMP_H 

#if defined(_OPENMP) && (__STDC_VERSION__ >= 199901L) 

#define PRAGMA(x) _Pragma(#x) 

#define OMP_PARALLEL PRAGMA(omp parallel) 
#define OMP_PARALLEL_FOR PRAGMA(omp parallel for schedule(static)) 
#define OMP_FOR PRAGMA(omp for schedule(static)) 

#define OMP_PARALLEL_FOR_COLLAPSE(n) PRAGMA(omp parallel for collapse(n) schedule(static)) 
#define OMP_PARALLEL_FOR_COLLAPSE2 OMP_PARALLEL_FOR_COLLAPSE(2) 
#define OMP_PARALLEL_FOR_COLLAPSE3 OMP_PARALLEL_FOR_COLLAPSE(3) 
#define OMP_PARALLEL_FOR_COLLAPSE4 OMP_PARALLEL_FOR_COLLAPSE(4) 

#define OMP_PARALLEL_FOR_REDUCE_ADD(r) PRAGMA(omp parallel for reduction (+ : r) schedule(static)) 

#else 

#warning No OpenMP, either because compiler does not understand OpenMP or C99 _Pragma. 

#define OMP_PARALLEL 
#define OMP_PARALLEL_FOR 
#define OMP_FOR 
#define OMP_PARALLEL_FOR_COLLAPSE(n) 
#define OMP_PARALLEL_FOR_COLLAPSE2 
#define OMP_PARALLEL_FOR_COLLAPSE3 
#define OMP_PARALLEL_FOR_COLLAPSE4 
#define OMP_PARALLEL_FOR_REDUCE_ADD(r) 

#endif 

#endif // PRAGMA_OPENMP_H