fortran编程的openmp线程问题。

ttarsu 2010-10-19 05:04:55
各位专家好~我遇到了这样的问题,就是在用fotran语言写的循环中使用openmp并行化,在双核cpu的情况下我发现两个核不是同时进行的,比如计算一百次循环,则线程0计算前五十次,完成之后线程1又计算后五十次,整个时间并没有有效节省。不知道这是为什么啊。按说两个核应该同时运行,时间能够节约一半的对吧?我用c语言编写的程序就能够成功达到这个目的,想咨询一下这是什么原因啊?是不是我什么地方设置不对啊?
我用的是ivf2008,Microsoft visual studio
...全文
690 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ttarsu 2010-11-03
  • 打赏
  • 举报
回复
啊,谢谢楼上,非常非常感谢。我再试试,有问题再来请教。
intel_iclifort 2010-11-01
  • 打赏
  • 举报
回复
2楼给出的代码,关键是并行的部分计算量实在太小了,建议将循环的次数增大再看看效果。否则创建线程的开销远大于并行部分。你用Intel Thread Profier或者VTune Ampfier XE看看

另外,你在并行区域的变量m其实是存在数据竞争的,建议保护起来,或者用OpenMP的reduce

3楼肯定是/Qopenmp的选项没有设置,所以编译器没有正确的链接OpenMP运行库,所以omp_get_thread_num未定义。这个只要看完整的编译器输出报告build log就能发现,或者在project属性中看看Fortran和Linker的完整command line。

注意缺省状态,/Qopenmp选项都是disabled,需要手动设置。

ttarsu 2010-10-27
  • 打赏
  • 举报
回复
或者换成下面这个简单的也有同样的问题啊。。
另外的一个问题是这个程序在debug模式可以运行,release就不行,显示

“1>Source1.obj : error LNK2019: 无法解析的外部符号 _OMP_GET_THREAD_NUM,该符号在函数 _MAIN__ 中被引用
1>Release\w11.exe : fatal error LNK1120: 1 个无法解析的外部命令”
program main

use ifport

implicit none

integer i, m
real(8) :: t, t1, t2

t1 = rtc()
m = 0
i = 0
call sub(i,m)
t2 = rtc()
t = t2 - t1
write(*,*)"t=", t

endprogram main


subroutine sub(i, m)
use omp_lib

implicit none

integer i, m
!$omp parallel do

do i = 1, 1000

m = m + i ! just to waste time
write (*,*)i, "threadnumber=", omp_get_thread_num()
enddo

endsubroutine
ttarsu 2010-10-27
  • 打赏
  • 举报
回复
ivf2008是 11.0.061版本9.0.21022.8RTM版本
链接时都加上了opemmp选项,并且调用omp_get_thread_num()可以看到确实是两个线程“0”和“1”在工作,
命令行我不是很会用啊。抱歉啊。比较笨。。。
代码在这里,烦劳看一下,
不是很麻烦吧。。。

program main

use ifport



implicit none

integer i, j, k, m
real(8) :: t, t1, t2

t1 = rtc()
m = 0
i = 0
j = 0
k = 0

call sub(i,j,k,m)


t2 = rtc()
t = t2 - t1
write(*,*)"t=", t
endprogram main



subroutine sub(i,j,k, m)
use omp_lib

implicit none

integer i,j,k, m
!$omp parallel do
do i = 1, 4
do j = 1, 4
do k = 1, 4
m = m + k * k
write (*,*)i, j, k, "threadnumber=", omp_get_thread_num()

enddo
enddo
enddo

endsubroutine



intel_iclifort 2010-10-21
  • 打赏
  • 举报
回复
1) IVF2008具体是什么版本呢? Intel Visual Fortran Compiler 11.0.0xx? 11.1.0xx ?

2) 编译和链接时都加上用 /Qopenmp 选项了么?

3)在命令行command line 编译和链接试试,看问题是否还存在? ifort /Qopenmp test.F

567

社区成员

发帖
与我相关
我的任务
社区描述
英特尔® 边缘计算,聚焦于边缘计算、AI、IoT等领域,为开发者提供丰富的开发资源、创新技术、解决方案与行业活动。
社区管理员
  • 英特尔技术社区
  • shere_lin
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧