在visual studio中运行OpenMP并行程序,设置的线程数NUM_THREADS与系统CPU线程数什么关系
比如说,我用omp_get_max_threads得到的最大线程数是4,但是我在设置并行部分的线程数NUM_THREADS的时候,就算是大于4,好像也还是有效果的。不太明...
比如说,我用omp_get_max_threads得到的最大线程数是4,但是我在设置并行部分的线程数NUM_THREADS的时候,就算是大于4,好像也还是有效果的。
不太明白其中什么原理…… 展开
不太明白其中什么原理…… 展开
2个回答
展开全部
在这里,先回顾一下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。
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。
展开全部
(1)不写,或者超出最大数,则都用最大数。
(2)并行的原则,就是要留意,别把系统资源锁死了,得不偿失,反而比单线程耗费更多时间。
(3)算法,特别是循环设计得当,可以取得接近线程倍数的提升。
(2)并行的原则,就是要留意,别把系统资源锁死了,得不偿失,反而比单线程耗费更多时间。
(3)算法,特别是循环设计得当,可以取得接近线程倍数的提升。
更多追问追答
追问
谢谢,大致了解了。
但是我把NUM_THREADS设置到50的时候(max是4),运行时间比4的时候缩短了一般(我知道我这个做法很搞笑……),这是什么原因呢?
追答
这就不太 了解了。建议在release模式下编译。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询
广告 您可能关注的内容 |