在#define宏中控制条件Openmp

时间:2019-06-22 16:56:33

标签: c++ visual-studio parallel-processing openmp

我想使用#define标志来控制是否使用openmp。由于#pragma不能放在#define内,所以我尝试了

#define USE_OPENMP  // Toggle this on/off

#ifdef USE_OPENMP
    #define OMP_FOR(n)   __pragma("omp parallel for if(n>10)") 
#else
    #define OMP_FOR(n)   // do nothing        
#endif

然后在我的代码中,我可以:

int size_of_the_loop = 11;
OMP_FOR(size_of_the_loop) // activate openmp if(n>10)
for(){
    //do stuff
}

我对#define相关内容不熟悉,想知道是否有可能实现这一目标?谢谢。

2 个答案:

答案 0 :(得分:2)

设置了_OPENMP编译器选项后,Microsoft编译器将定义/openmp宏。您可以按照以下形式使用它:

#ifdef _OPENMP
    #include <omp.h>     // This line won't add the library if you don't compile with -fopenmp option.
    #ifdef _MSC_VER
         // For Microsoft compiler
         #define OMP_FOR(n) __pragma(omp parallel for if(n>10)) 
    #else  // assuming "__GNUC__" is defined
         // For GCC compiler
         #define OMP_FOR(n) _Pragma("omp parallel for if(n>10)")
    #endif
#else
    #define omp_get_thread_num() 0
    #define OMP_FOR(n)
#endif

现在您可以像这样使用OMP_FOR(n)

int main() {
    int n=11;

    OMP_FOR(n)
    for(int i=0; i<4; i++)
        printf("Thread %d\n",omp_get_thread_num());
}

您必须使用以下命令来编译代码:

cl /fopenmp file.c

或者,如果您使用的是GCC,

gcc -fopenmp file.c -o exe

n>10的输出:

Thread 2
Thread 0
Thread 1
Thread 3

n<10的输出:

Thread 0
Thread 0
Thread 0
Thread 0

答案 1 :(得分:2)

如注释之一所示,OpenMP编译器必须根据OpenMP规范定义_OPENMP

由于OpenMP指令基于编译指示,因此如果编译器不支持OpenMP或未通过编译器开关启用OpenMP,则编译器应忽略OpenMP指令。因此,除非您依赖于OpenMP运行时API调用,否则通常无需在大多数代码中使用_OPENMP

编辑:OpenMP体系结构审查委员会在https://github.com/OpenMP/sources处发布存根库作为源代码。此存根库可用于提供OpenMP API运行时库符号,并获取“ no op”存根,这些存根可以正确实现单线程执行的语义。