回 帖 发 新 帖 刷新版面

主题:[讨论]求助:关于子程序内部并行计算

这两天刚接触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个回复)

沙发

运行时设置OMP的THREADS数为多少呢?

板凳

没有手动设置threads个数。
[em18]

3 楼

请问如何设置?找到的教程太简单,没讲这个,呵呵

4 楼

设置环境变量:
OMP_NUM_THREADS
set OMP_NUM_THREADS=4
试试~~~~

5 楼

好像不行,但还是谢谢你O(∩_∩)O

6 楼

对了,你查查你所使用的编译器的文档,看看它支不支持:omp parallel do reduction

7 楼

这个倒是支持哦

8 楼

是这样的, openmp默认是关闭了并行嵌套. 所以你在section下面再用parallel do, 后者就不起作用了. 所以只有2个section就只开2个线程.
可以设置环境变量来开启并行嵌套, 大概是什么 nested parallel之类的, 你查查资料. 我不在学校手上没资料.

9 楼

谢谢指教

我来回复

您尚未登录,请登录后再回复。点此登录或注册