在visual studio中运行OpenMP并行程序,设置的线程数NUM_THREADS与系统CPU线程数什么关系

比如说,我用omp_get_max_threads得到的最大线程数是4,但是我在设置并行部分的线程数NUM_THREADS的时候,就算是大于4,好像也还是有效果的。不太明... 比如说,我用omp_get_max_threads得到的最大线程数是4,但是我在设置并行部分的线程数NUM_THREADS的时候,就算是大于4,好像也还是有效果的。
不太明白其中什么原理……
展开
 我来答
掬颜王木瓣1552
2017-04-08 · TA获得超过194个赞
知道答主
回答量:275
采纳率:0%
帮助的人:78.6万
展开全部
在这里,先回顾一下OpenMP的parallel并行区域线程数量的确定,对于一个并行区域,有一个team的线程去执行,那么该分配多少个线程去执行呢?

OpenMP的遇到parallel指令后创建的线程team的数量由如下过程决定:
1. if子句的结果
2. num_threads的设置
3. omp_set_num_threads()库函数的设置
4. OMP_NUM_THREADS环境变量的设置
5. 编译器默认实现(一般而言,默认实现的是总线程数等于处理器的核心数)
(查看更多信息)

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。
wangyongsk50
2017-04-08 · TA获得超过7253个赞
知道大有可为答主
回答量:1.2万
采纳率:91%
帮助的人:1889万
展开全部
(1)不写,或者超出最大数,则都用最大数。
(2)并行的原则,就是要留意,别把系统资源锁死了,得不偿失,反而比单线程耗费更多时间。
(3)算法,特别是循环设计得当,可以取得接近线程倍数的提升。
更多追问追答
追问
谢谢,大致了解了。
但是我把NUM_THREADS设置到50的时候(max是4),运行时间比4的时候缩短了一般(我知道我这个做法很搞笑……),这是什么原因呢?
追答
这就不太 了解了。建议在release模式下编译。
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式