
OpenMP的遇到parallel指令后创建的线程team的数量由如下过程决定:
1.
if子句的结果
2.
num_threads的设置
3.
omp_set_num_threads()库函数的设置
4.
OMP_NUM_THREADS环境变量的设置
5.
编译器默认实现(一般而言,默认实现的是总线程数等于处理器的核心数)
(http://blog.csdn.net/gengshenghong/article/details/6956878查看更多信息)
2、3、4优先级依次降低的,也就是前面的设置可以覆盖后面的设置,当然也是相对而言,num_threads子句只会影响当前的并行区域,而omp_set_num_threads对OMP_NUM_THREADS环境变量的覆盖是在整个程序运行期间全局的。
(2)几个容易混淆的OpenMP函数
1.
omp_get_thread_num
获取线程的num,即ID。这里的ID是OpenMP的team内的ID,在OpenMP中,一个team内的线程的ID是俺顺序排列的,0、1、2...
说明:此函数在并行区域外或者并行区域内都可以调用。在并行区域外,获取的是master线程的ID,即为0。在并行区域内,每次执行到此函数,获取的是当前执行线程的ID。
OpenMP在Windows环境下比较容易实现,只要打开VS2008中的编译选项/openmp,设置一下环境变量OMP_NUM_THREADS就可以了。一般是新建一个c++项目,以次选择Project ->(alt+f7)属性 ->配置属性(configuration property) ->c/c++ ->语言(Language),打开OpenMP支持;
设置环境变量:我的电脑 ->属性 ->高级 ->环境变量,新建一个OMP_NUM_THREADS变量,值设为2,即为程序执行的线程数。
至于其它环境变量,在使用的时候我们再设置就可以了,所以暂时不考虑。这样,就可以进行OpenMP程序设计了。
测试例子1:
#include "omp.h"
int main(int argc, char* argv[])
{
#pragma omp parallel
for()
{
int i = 0
i++
int y = i
}
return 0
}
可以在任务管理器中看到CPU跑到100%。
测试例子2:
#include <stdio.h>
#include <omp.h>
int main()
{
omp_set_num_threads(2)
#pragma omp parallel
printf("Hello from Thread NO.%d\n", omp_get_thread_num())
return 0
}
程序运行结果为:
Hello from Thread NO.0
Hello from Thread NO.1
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)