24小时热门版块排行榜    

查看: 826  |  回复: 1

appleft93

新虫 (初入文坛)

[求助] fortran程序采用openMP并行问题 已有1人参与

各位大神,初学fortran openMP并行,有个关于!$OMP SECTIONS 的小问题。
程序结构如下

program TestOpenMP
   (此处变量声明略去)   
    call cpu_time(start)  ! 记录开始时间
     
    !$OMP PARALLEL
    !$OMP SECTIONS
    !$OMP SECTION
      call aaa
    !$OMP SECTION
      call aaa
    !$OMP END SECTIONS NOWAIT
    !$OMP END PARALLEL

    call cpu_time(finish)

   
    write(*,*)'time = ',finish-start
    pause
    end program TestOpenMP




   subroutine aaa
   ......
   return
   end


其中 subroutine aaa程序执行时间较长(串行执行一次大概35s),于是我就想用两个线程同时执行这个,这样的话时间可以大概减少一半。但是测试发现,串行执行两次aaa和并行执行的时间是差不多的,,并且并行时间反而会长0.2s左右。

请教一下这是怎么回事呢?我是初学者 不太懂,看了一些资料自己写了一下这个程序。请大神指导!
回复此楼
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖

cntsinghua

银虫 (初入文坛)

【答案】应助回帖

(1)你这种写法是subroutine aaa被两个线程分别执行一次,即subroutine aaa被执行两遍。
(2)并行是需要时间开销的,因此并行时间反而会长0.2s左右。
(3)如果希望subroutine aaa被两个线程并行。如果是循环结构,建议使用指令parallel for。如果不是循环结构,须手工进行任务分解,然后用指令task解决。
(4) 建议借阅参考书
雷洪, 胡许冰. 多核并行高性能计算OpenMP. 北京: 冶金工业出版社. 2016年, ISBN: 978-7-5024-7249-8
2楼2018-02-09 10:15:37
已阅   回复此楼   关注TA 给TA发消息 送TA红花 TA的回帖
相关版块跳转 我要订阅楼主 appleft93 的主题更新
信息提示
请填处理意见