OpenMP的环境变量及库函数
OpenMP的环境变量:
环境变量 | 描述 | 示例 |
OMP_SCHEDULE | 控制for循环任务分配结构的调度 | OMP_SCHEDULE="guided,2" |
OMP_NUM_THREADS | 设置默认线程的个数 | OMP_SCHEDULE=4 |
OpenMP的库函数
函数名称 | 描述 |
int omp_get_num_threads(void) | 返回当前使用的线程个数,如果在并行区域外则返回1 |
int omp_set_num_threads(int i) | 设置要使用的线程个数,它可以覆盖OMP_NUM_THREADS |
int omp_get_thread_num(void) | 返回当前线程号,0代表主线程 |
int omp_get_num_procs(void) | 返回可用的处理核(处理器)个数,对于支持超线程技术的处理器被算作两个处理核 |
OpenMP的调度方案
调度类型 | 描述 |
static | 将所有循环迭代划分成相等大小的块 |
dynamic | 使用一个内部队列,当某线程可用时,为其分配由块大小所制定的一定数量的循环迭代 |
guided | 与dynamic策略类似,但是块大小开始较大,后来逐步减小。可选参数chunk指定块大小的最小值,默认为1 |
runtime | 运行时由OMP_SCHEDULE决定使用上面三种的哪种策略 |
OpenMP的编译
平台和编译器 | 命令 |
windows平台 intel C++编译器 | icl /Qopenmp |
linux平台 intel C++编译器 | icl -openmp |
gcc | gcc -fopenmp |
_OPENMP宏可以用来判断OpenMP是否被支持,通过它可以写出任何C语言编译器(即使不支持OpenMP)都可以编译的代码。代码如下所示:
#ifdef _OPENMP
#include <omp.h>
#else
#define omp_get_thread_num() 0
#endif
Visual C++® 2008对OpenMP的支持
VC++2008根据项目属性配置的指示进行 /openmp编译器切换,当配置了OpenMP支持后,编译器会提供_OPENMP定义,可以使用#ifdef _OPENMP来决定程序使用或者不使用OpenMP。
配置VC++2008项目,在project的property页面上的C/C++ -> Language 选项卡中将OpenMP Support这项设置为Yes,在需要使用OpenMP函数的cpp文件中引用#include <omp.h>,这样设置就完成了。