我想使用#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
相关内容不熟悉,想知道是否有可能实现这一目标?谢谢。
答案 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”存根,这些存根可以正确实现单线程执行的语义。