主题:[讨论]求助:关于子程序内部并行计算
airchampion
[专家分:0] 发布于 2011-05-08 15:43:00
这两天刚接触OpenMP,有些地方没搞懂,希望得到各位大侠的帮助。
部分程序如下
Program main
……
……
!$omp parallel sections
!$omp section
call sub(n,sum1)
!$omp section
call sub(n,sum2)
!$omp end parallel sections
……
end
subroutine sub(n,sum)
sum=0
!$omp parallel do reduction(+:sum)
do i=1,n
sum=sum+exp(dabs(dsin(dsqrt(dfloat(i)))))**3.d-1+
+ exp(dabs(dcos(dlog(dfloat(i)))))**7.d-1
enddo
!$omp end parallel do
return
endsubroutine
该程序主程序部分用了parallel sections,应该同时有两个进程计算。
子程序用了parallel do,应该能有四个进程参与计算(我的计算机为4核)
可程序实际执行的时候,只用了两个核心,50%的CPU使用率。
子程序的parallel do似乎没怎么起作用,什么呢?
谢谢O(∩_∩)O谢谢
回复列表 (共9个回复)
沙发
cgl_lgs [专家分:21040] 发布于 2011-05-09 13:31:00
运行时设置OMP的THREADS数为多少呢?
板凳
airchampion [专家分:0] 发布于 2011-05-09 17:05:00
没有手动设置threads个数。
[em18]
3 楼
airchampion [专家分:0] 发布于 2011-05-09 17:40:00
请问如何设置?找到的教程太简单,没讲这个,呵呵
4 楼
cgl_lgs [专家分:21040] 发布于 2011-05-10 11:50:00
设置环境变量:
OMP_NUM_THREADS
set OMP_NUM_THREADS=4
试试~~~~
5 楼
airchampion [专家分:0] 发布于 2011-05-11 09:36:00
好像不行,但还是谢谢你O(∩_∩)O
6 楼
cgl_lgs [专家分:21040] 发布于 2011-05-11 10:21:00
对了,你查查你所使用的编译器的文档,看看它支不支持:omp parallel do reduction
7 楼
airchampion [专家分:0] 发布于 2011-05-11 11:23:00
这个倒是支持哦
8 楼
yeg001 [专家分:14390] 发布于 2011-05-11 11:51:00
是这样的, openmp默认是关闭了并行嵌套. 所以你在section下面再用parallel do, 后者就不起作用了. 所以只有2个section就只开2个线程.
可以设置环境变量来开启并行嵌套, 大概是什么 nested parallel之类的, 你查查资料. 我不在学校手上没资料.
我来回复