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
相关的东西不熟悉,想知道是否可以实现这一目标?谢谢。
_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)
OpenMP 编译器必须_OPENMP
按照 OpenMP 规范进行定义,如注释之一所示。
由于 OpenMP 指令基于编译指示,因此如果编译器不支持 OpenMP 或者未通过编译器开关启用 OpenMP,则编译器应忽略 OpenMP 指令。因此,除非您依赖 OpenMP 运行时 API 调用,否则通常不需要_OPENMP
在大多数代码中使用。
编辑:OpenMP 架构审查委员会在https://github.com/OpenMP/sources上发布了一个存根库作为源代码。该存根库可用于提供 OpenMP API 运行时库符号并获取正确实现单线程执行语义的“无操作”存根。
归档时间: |
|
查看次数: |
3649 次 |
最近记录: |