openmp怎么用函数配置线程数

openmp怎么用函数配置线程数,第1张

在这里,先回顾一下OpenMP的parallel并行区域线程数量的确定,对于一个并行区域,有一个team的线程去执行,那么该分配多少个线程去执行呢?

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


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/tougao/7739938.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-09
下一篇2023-04-09

发表评论

登录后才能评论

评论列表(0条)

    保存