2016-01-28 3 views
3

J'ai essayé de construire un wrapper autour de MPI et OpenMP pour avoir un format unifié à coder au lieu de devoir continuer à basculer entre MPI_xxx, omp_xxx et #pragma omp xxx.Comment créer un wrapper pour un pragma et le faire compiler correctement?

J'ai eu des problèmes en créant une enveloppe autour des différentes directives OMP #pragma, jusqu'à présent le meilleur que j'ai obtenu est d'avoir comme:

#define _mmc_(x) _Pragma("omp ## #x") 

(mmc est le nom provisoire pour mon bibliothèque)

donc, si je voulais avoir

#pragma omp parallel for 

L'enveloppe correspondante doit être

_mmc_(parallel for) 

Cependant quand il compile le compilateur semble évaluer différemment, en me donnant l'avertissement de compilation

test.cpp:22:0: warning: ignoring #pragma omp [-Wunknown-pragmas] 
    _mmc_(parallel for) 

Je compile avec mpiC++ pour MPICH 3.0.4 autour gcc 4.8.4 dans Ubuntu 14.04, avec le drapeaux

-fopenmp -lm -std=c++11 -Wall 

y at-il quelque chose que je peux faire ou ajouter au code pour faire ce travail, ou est-ce juste quelque chose qui ne peut être fait avec les outils actuels?

+0

Petite note: les noms globaux commençant par des traits de soulignement sont réservés pour l'implémentation. – chris

Répondre

2

Cela devrait fonctionner, as seen here:

#define PRAGMA(x) _Pragma(#x) 
#define _mmc_(x) PRAGMA(omp x) 

_Pragma est un peu stricte sur la prise d'une chaîne littérale, donc nous faisons que littéral de la chaîne entière de l'argument de pragma plutôt que assemblant ensemble à l'intérieur _Pragma. Les opérateurs de préprocesseur ne fonctionneront pas dans un littéral de chaîne, comme vous l'avez essayé dans votre publication.

+0

Merci! Cela fonctionne exactement comme je le voulais. Merci aussi pour la note sur les noms commençant par des underscores, j'avais complètement oublié cela. –