openmp Fortran --- 显示相同性能的代码

openmp Fortran--- Code showing same performance

我是openmp的新用户。我用 fortran 编写了以下代码,并尝试使用 openmp 为其添加并行功能。不幸的是,它与该子例程的串行版本花费的时间相同。我正在使用这个 f2py 命令编译它。可以肯定的是,我在这里遗漏了一个关键概念,但无法弄清楚。非常感谢获得这方面的帮助。

!f2py -c --opt='-O3' --f90flags='-fopenmp' -lgomp -m g3Test g3TestA.f90

exp1 =0.0
exp2 =0.0
exp3 =0.0

!$OMP PARALLEL DO shared(xConfig,s1,s2,s3,c1,c2,c3) private(h)&
!$OMP REDUCTION(+:exp1,exp2,exp3)   
do k=0,numRows-1
    xConfig(0:2) = X(k,0:2)
    do h=0,nPhi-1
        exp1(h) = exp1(h)+exp(-((xConfig(0)-c1(h))**2)*s1)
        exp2(h) = exp2(h)+exp(-((xConfig(1)-c2(h))**2)*s2)
        exp3(h) = exp3(h)+exp(-((xConfig(2)-c3(h))**2)*s3)
    end do
end do 
!$OMP END PARALLEL DO

ALine = exp1+exp2+exp3

例如,正如 in this OpenMP Performance training course material from the University of Edinburgh 所解释的那样,有很多原因导致 OpenMP 代码不一定像您预期的那样扩展(例如,您正在并行化的部分占用了多少串行运行时、线程间的同步、通信和其他并行开销)。

您可以通过调用 python 脚本轻松测试不同线程数的性能,例如有 2 个线程:

env OMP_NUM_THREADS=2 python <your script name>

并且您可以考虑在您的代码示例中添加以下行,以视觉确认您的代码的 OpenMP 部分中使用的线程数:

do k=0,numRows-1
    !this if-statement is only for debugging, remove for timing
    !$ if (k==0) then
    !$     print *, 'num_threads running:', OMP_get_num_threads()
    !$ end if
    xConfig(0:2) = X(k,0:2)