Fortran Coder

查看: 6462|回复: 9
打印 上一主题 下一主题

[并行] 小白求指点,如何使用OpenMP

[复制链接]

60

帖子

17

主题

0

精华

专家

F 币
454 元
贡献
266 点
跳转到指定楼层
楼主
发表于 2014-12-16 08:58:49 | 显示全部楼层 回帖奖励 |倒序浏览 |阅读模式
今天下了一个OpenMP的PDF并试验了一下,发现运算时间根本没有减少
以下是代码:
[Fortran] 纯文本查看 复制代码
integer::I
integer,dimension(100000)::a
real::stime,etime
!!$OMP PARALLEL
!Print*,"ok"
!!$OMP END PARALLEL

call cpu_time(stime)

!$OMP DO
do i=1,100000
  do j=1,100000
    k=J
  enddo
  a(i)=i**2+1
end do
!$OMP END DO
call cpu_time(etime)
write(*,*)stime,etime,etime-stime

pause
end


这个的运行时间是18.46812

而 把omp的语句删除之后运行时间是18.37692

是我打开方式有问题吗?

!$OMP PARALLEL
Print*,"ok"
!$OMP END PARALLEL
这段代码检查了一下,系统是8核的,也确实出现了八个OK,说明设置没有错误。
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

60

帖子

17

主题

0

精华

专家

F 币
454 元
贡献
266 点
沙发
 楼主| 发表于 2014-12-17 08:54:13 | 显示全部楼层
li913 发表于 2014-12-16 10:29
2、所有并行语句都必须包含在并行域中,否则视为串行。
!$OMP PARALLEL DO clause1 clause2 ...
...

谢谢指点。
也就是说在用OMP的时候,必须要人为的划分一片并行域并在这块域中执行并行代码,而不是说让计算机自己判断。
但是我用
!$OMP PARALLEL DO clause1 clause2 ...
...
!$OMP END PARALLEL DO
这个的时候老是报错,最后就是
!$OMP PARALLEL
...
!$OMP END PARALLEL
来划分并行域。
并且执行时间是23秒左右,反而比单线程的18秒还要慢
这就是传说中的不做死就不会死?

还有cpu_time 跟OMP_get_wtime()的区别是什么?是不是cpu_time只是返回当前运行cpu_time函数的线程的时间而非每一个线程执行完后的时间?

谢谢~~~~

60

帖子

17

主题

0

精华

专家

F 币
454 元
贡献
266 点
板凳
 楼主| 发表于 2014-12-18 09:19:14 | 显示全部楼层
li913 发表于 2014-12-17 11:29
4、对比效率时,需在release模式下,并关闭优化。

太感谢了,谢谢指点!!
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-5-3 09:37

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表