当我尝试在子程序中执行以下操作时,我没有获得任何加速:
!$ call omp_set_num_threads(threadno)
call system_clock(x1)
!$OMP PARALLEL do private(i), reduction(+:total)
do i = 1,m
total = 0.d0
call result(a,l,b,qm,q,en) !here l is input for subroutine and en is output
qm(:,i) = q
qtv(i) = qt
mean = sum(q)/size(q)
do i2 = 1,k
total = total + ((mean-q(i2))**2)/(a+b)
end do
qvv(i1) = total
end do
call system_clock(x2)
print *, x2-x1
!$OMP END PARALLEL do
答案 0 :(得分:0)
关于OpenMP部分的评论:
total
不应在循环中重置,而应在!$OMP
子句之前重置。i2
和mean
应该是私密的。q
在循环的迭代之间没有变化,sum(q)/size(q)
应放在外面。 缺乏私密设置可能导致内存访问冲突(从而导致速度减慢)。
我猜您显示的代码接近但不是您编译的代码。使用已编译的代码来提供更好的帮助会很有用。
干杯,
皮尔
编辑:对于OpenMP代码的计时,您应该使用omp_get_wtime
(请参阅https://gcc.gnu.org/onlinedocs/libgomp/omp_005fget_005fwtime.html)来提供临时https://en.wikipedia.org/wiki/Wall-clock_time。 openmp例程的模块加载了use omp_lib