在 #define 宏中控制条件 Openmp

Use*_*222 5 c++ parallel-processing openmp visual-studio

我想用一个#define标志来控制是否使用 openmp。由于#pragma不能不在 a 内#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
Run Code Online (Sandbox Code Playgroud)

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

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

我对#define相关的东西不熟悉,想知道是否可以实现这一目标?谢谢。

Pab*_*ero 7

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

#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
Run Code Online (Sandbox Code Playgroud)

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());
}
Run Code Online (Sandbox Code Playgroud)

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

cl /fopenmp file.c
Run Code Online (Sandbox Code Playgroud)

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

gcc -fopenmp file.c -o exe
Run Code Online (Sandbox Code Playgroud)

输出n>10

Thread 2
Thread 0
Thread 1
Thread 3
Run Code Online (Sandbox Code Playgroud)

输出n<10

Thread 0
Thread 0
Thread 0
Thread 0
Run Code Online (Sandbox Code Playgroud)

  • @User800222我不知道这是否是最传统的方式,但它的使用相当广泛。我翻遍了官方手册,没有找到任何关于 USE_OPENMP 的内容。您可以在官方手册(https://www.openmp.org/wp-content/uploads/OpenMP4.0.0.pdf)的第2.2章(第40页)中找到有关如何使用_OPENMP的更多信息。 (2认同)
  • 我添加了 Microsoft 文档和指令/关键字的链接,因为 OP 用“visual-studio”标记了问题。 (2认同)

Mic*_*emm 6

OpenMP 编译器必须_OPENMP按照 OpenMP 规范进行定义,如注释之一所示。

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

编辑:OpenMP 架构审查委员会在https://github.com/OpenMP/sources上发布了一个存根库作为源代码。该存根库可用于提供 OpenMP API 运行时库符号并获取正确实现单线程执行语义的“无操作”存根。