[转]OpenMP怪问题

zhsj64 2007-06-18 11:00:52
我近日遇到一个奇怪的问题,想不通……
我写了个OpenMP的测试程序,放在不同CPU的机上使用相同的编译器(Intel Visual Fortran Compiler 9.1)编译,运行时间差别很大。例如下面这程序:
! OMPtest.f90
program OMPtest
implicit none
integer, parameter :: N = 100
real(8) :: A(N, N), B(N, N), C(N, N), D(N, N)
integer :: i,LN = 1000000
integer :: timediff, time(2)
integer :: num_threads = 2

call omp_set_num_threads(num_threads)
call random_number(A)
call random_number(B)

! clock
call system_clock(time(1))

!$OMP PARALLEL
!$omp do
do i = 1, LN
C = A + B
end do
!$omp end do

call system_clock(time(2))
timediff = time(2) - time(1)

print *, "Elapsed time is", timediff / 10000e0, "seconds"
print *, C(1 : 3, 1 : 3)
end program OMPtest
这程序是有毛病的,主要是!$omp do这句,后面应该加上private(C)或lastprivate(C)字句,避免下面的循环在多线程运算时,使用相同的C。
这程序在E6400中编译运行时,竟然毫无问题,使用10秒左右就算完(单线程时要约17秒)。然而,把这相同的程序,放到Pentium D 925上运算,也是使用双线程,竟然要50多秒才算完(单线程时要约18秒)。尽管CPU不同,但我是用相同的编译器,用相同的参数去编译,实在不能理解为什么结果会差那么多。当然,在!$omp do后面加上private(C)或lastprivate(C)字句,Pentium D 925也能用10秒多一点算完这个程序。
...全文
174 回复 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

568

社区成员

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

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