Performance 用Fortran提高计算速度
我有一些基本的psuedo代码,如下所示Performance 用Fortran提高计算速度,performance,optimization,fortran,gfortran,Performance,Optimization,Fortran,Gfortran,我有一些基本的psuedo代码,如下所示 PROGRAM PSUEDOEXAMPLE IMPLICIT NONE !Define all types !Load some data into arrays: Array_I, Array_J !Do Loops do i = 1,10 xi = Array_I(i,1) yi = Array_I(i,2) zi = Array_I(i,3) do j =1,10 xj = Array_J(j,1)
PROGRAM PSUEDOEXAMPLE
IMPLICIT NONE
!Define all types
!Load some data into arrays: Array_I, Array_J
!Do Loops
do i = 1,10
xi = Array_I(i,1)
yi = Array_I(i,2)
zi = Array_I(i,3)
do j =1,10
xj = Array_J(j,1)
yj = Array_J(j,2)
zj = Array_J(j,3)
separation = ((xi - xj)**2 + (yi-yj)**2 +(zi-zj)**2)**0.5
enddo
enddo
END PROGRAM PSUEDOEXAMPLE
我可以将单个
I
-步所需的时间定为~0.3秒。减少这一时间的最佳方法是什么?我可以看出,删除平方根可能是有效的。我正在使用gfortran作为编译器。您可能需要提供一些有关您正在使用的编译器标志的信息,可能还需要提供一些有关编译器版本和系统的信息(这将有助于人们比较您的系统和他们的系统上的时间)。您可能希望尝试使用sqrt
函数而不是**0.5
,更具体一些可以帮助编译器(虽然在这里可能没有太大影响。我认为您还需要提供更多有关如何计时的详细信息--有好的方法和坏的方法!最后,您能否显示!Define all types
的实际代码而不是此注释?我可以看出,删除平方根可能会很有效,删除所有代码可以有效地加快程序的速度,但这可能不是一个有效的步骤……你真正想做什么?如果你有一个多核CPU,OpenMP可能是一个选项,因为这个问题是对称的,你可以通过只做一半的计算来加快计算速度(使用do j=i+1,10
作为内部循环)@haraldklJ
点集与I
点集(不一定)相同。如果他们遵循您的建议,则不会发现与点I(10)
的分离。