我是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
答案 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)