FORTRAN 77程序比Fortran 90程序快吗?

时间:2012-01-02 22:29:02

标签: fortran legacy fortran90 fortran77

今天我正在阅读FORTRAN 77中编写的一些非常流行的数字库中的代码,例如QUADPACK(last updated in 1987),我想知道是否有任何理由不重写Fortran 90中的那些库除了大鉴于Fortran 90为语言带来的巨大改进,包括自由形式的源代码,更好的控制结构,以及可以忘记GO TO,矢量化,接口等等,它将带来的工作量。

是不是因为FORTRAN 77编译器产生了更优化的代码,也许它更适合并行执行?请注意,我甚至不是在谈论Fortran 2003,仅仅 8岁:我在谈论Fortran 90,所以我认为它已经足够广泛并且编译器已经准备好了。无论如何,我没有与业界联系。

编辑:janneb是对的:LAPACK实际上是用Fortran 90编写的。

4 个答案:

答案 0 :(得分:16)

好吧,就像“pst”所提到的那样,“它将带来的大量工作”是一个很重要的原因。

还有一些小问题:

  • LAPACK现在是Fortran 90,因为最新版本不再使用F77编译器编译。话虽如此,它远非重写,只有少数事情发生了变化。

  • 您提到的大多数F90功能使编写健壮的程序变得更容易,更快,没有必要让生成的程序更快。

  • 不久前,免费的F90编译器不可用(很多人使用g77!),因此对于像LAPACK这样广泛使用的库,不使用F90功能可能是一个有意识的决定。

  • 通常,F77编译器不会产生比F90编译器更快的代码。如果没有任何其他原因,那么因为它可能已经过时,无法针对最新的CPU进行优化。现代Fortran编译器可能会从F77创建更快的代码,而不是来自等效的F90程序,它大量使用指针等等,但这高度依赖于所讨论的程序(例如,使用指针和更高级的数据结构可能允许更好地使用算法,允许F90程序更快地产生结果,即使它可能以较低的CPU算术单位平均利用率执行。)

  • Vectorization,如果这意味着F90 +数组语法,主要是程序员的便利问题,而不是允许更快的代码。一个称职的编译器也会对等效的DO循环进行矢量化。

答案 1 :(得分:6)

没有理由投入大量工作(或许)改进运作良好的东西。应该注意的是,即使Fortran 90引入了许多新功能,它也没有改变语言。请记住,Fortran 90 Standard向后兼容FORTRAN 77.现代编译器也能够优化FORTRAN 77代码。 Fortan 90中引入了一些功能(例如指针)会妨碍效率,如果关注执行时间,应该避免这种功能。在HPC。

所以它不会真正有所作为。对于现代编译器,编写良好的FORTAN 77也是可以优化的 - 它就像一块没有结冰的蛋糕。在Fortran 90及更高版本的情况下,结冰看起来比它的味道更好 - 这对程序员来说很方便,但不一定能提高程序效率。

答案 2 :(得分:5)

Fortran 77程序可能更快的原因有一个:

分配的数组(Fortran 90)比声明的编译时数组要慢得多。 两者都没有放在内存中的同一个地方。这是Fortran中的堆栈与堆内存管理。

See here for instance

据说,Fortran 90+具有快速“全部阻止”阵列操作。我是gcc-fortran(gfortran)的忠实粉丝,没有任何编译选项,对于大小为N的数组

a = a + 1

快4倍
do i = 1 , N
  a(i) = a(i) + 1
end do

这台工作台适合我,在我的机器上,没有优化选项的gfortran,并且没有任何声称这是专业基准测试。

分配“问题”(这不是问题而是功能)不是架构,编译器或任何与Fortran标准相关的东西。

答案 3 :(得分:1)

F77程序是慢还是快,然后用更新的语法重写的等效F90程序是可以讨论的,但是现在让我们忽略它。

但应该考虑的是,没有人真正关心速度 。人们只关心 相关 的情况下的执行速度,以及 商业盈利 (我确信有一个更好的术语,但现在没有任何想法... 成本效益也许。)

由于这两个(相当受欢迎的图书馆)仍然在F77,很明显,一般认为重写它们的成本超过了所获得的利益,执行速度方面的好处以及成本方面的好处整个过程的有效性。