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