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

时间:2018-05-25 00:10:53

标签: fortran openmp f2py

我是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

1 个答案:

答案 0 :(得分:2)

正如[{3}}巧妙地解释的那样,为什么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)