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

FORTRAN 77程序比FORTRAN 90程序快吗?,fortran,legacy,fortran90,fortran77,Fortran,Legacy,Fortran90,Fortran77,今天,我正在阅读一些非常流行的用FORTRAN 77编写的数字库的代码,比如QUADPACK(),我想知道,考虑到FORTRAN 90给语言带来的巨大改进,包括自由格式的源代码,除了它会带来大量的工作外,还有什么理由不在FORTRAN 90中重写这些库,更好的控制结构可以被遗忘,矢量化,接口等等 是因为FORTRAN 77编译器产生了更优化的代码,还是它更适合并行执行?请注意,我甚至没有谈论Fortran 2003,例如,它只有8年的历史:我谈论的是Fortran 90,所以我假设它已经足够广泛

今天,我正在阅读一些非常流行的用FORTRAN 77编写的数字库的代码,比如QUADPACK(),我想知道,考虑到FORTRAN 90给语言带来的巨大改进,包括自由格式的源代码,除了它会带来大量的工作外,还有什么理由不在FORTRAN 90中重写这些库,更好的控制结构可以被遗忘,矢量化,接口等等

是因为FORTRAN 77编译器产生了更优化的代码,还是它更适合并行执行?请注意,我甚至没有谈论Fortran 2003,例如,它只有8年的历史:我谈论的是Fortran 90,所以我假设它已经足够广泛,编译器已经准备好了。不管怎样,我和这个行业没有联系


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

我们可以讨论F77程序比同等的F90程序(用较新的语法重写)慢还是快,但我们暂时不考虑这一点

然而,应该考虑的是,没有人真正关心速度,只有速度。人们只关心与之相关的执行速度,以及业务盈利的执行速度(我相信有更好的术语,但现在想不起来了……也许成本效益更高)

由于这两个(相当受欢迎的库)仍在F77中,很明显,一般认为重写它们的成本大于获得的收益,在执行速度方面的收益,以及在整个过程的成本效益方面的收益

就像前面提到的“pst”一样,“它将带来大量的工作”是一个非常重要的原因

还有一些小问题:

  • LAPACK现在是Fortran 90,因为最新版本不再使用F77编译器进行编译。话虽如此,这远非重写,只是改变了一些东西

  • 您提到的大多数F90功能使编写健壮的程序变得更容易、更快,而无需使生成的程序更快

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

  • F77编译器通常不会比F90编译器生成更快的代码。如果不是因为其他原因,那是因为它可能已经过时,无法针对最新的CPU进行优化。现代Fortran编译器从F77生成的代码可能比从同等的F90程序生成的代码要快,后者大量使用指针等,但这在很大程度上取决于所讨论的程序(例如,使用指针和更高级的数据结构可能允许使用更好的算法,允许F90程序更快地生成结果,即使它可能以更低的CPU算术单元平均利用率执行)

  • 矢量化,如果你指的是F90+数组语法的话,主要是一个程序员方便的问题,而不是允许更快的代码。一个有能力的编译器也会矢量化等价的DO循环


    • 没有理由投入大量工作(也许)改进一些运行良好的功能。应该注意的是,尽管Fortran 90引入了许多新功能,但并没有改变语言。请记住,Fortran 90标准与Fortran 77向后兼容。现代编译器也可以优化Fortran 77代码。Fortan 90中引入了一些功能(例如指针)会妨碍效率,如果关注执行时间,则应避免这种情况,例如在HPC中


      因此,这并没有什么区别。对于一个现代编译器来说,编写良好的FORTAN 77同样是可优化的——它就像一块没有糖霜的蛋糕。在Fortran 90和更高版本中,糖霜看起来比味道更好——这对程序员来说是一种方便,但不一定能提高程序效率。

      有一个主要的问题是:eason为什么Fortran 77程序可能更快:

      分配的数组(Fortran 90)比编译时声明的数组慢得多。 两者在内存中不是放在同一个位置,这就是Fortran中的堆栈与堆内存管理

      话虽如此,Fortran 90+具有快速的“块内”数组操作。我非常喜欢gcc Fortran(gfortran),对于大小为N的数组,没有任何编译选项

      a = a + 1
      
      速度是原来的4倍

      do i = 1 , N
        a(i) = a(i) + 1
      end do
      
      这是我的工作台,在我的机器上,在gfortran上,没有优化选项,也没有任何人叫嚣这是专业的基准测试


      分配“问题”(这不是一个问题,而是一个特性)不是体系结构、编译器或任何相关的东西,而是Fortran标准。

      我认为这是一个已经被证明是竞争者的东西的“大量工作”。许多“更高级别”语言结构很好,但如果没有范式转换,它们很少有利于性能。也就是说,“使用新语法的代码”并不意味着“更好的编译器优化”,甚至F77(尽管我很痛苦地承认)也是“高水平的”语言。高效的Fortran代码应以F77功能为核心,以获得高性能,大多数较新的功能通常会导致效率较低的可执行文件。F90和较新的功能主要用于代码的可维护性和可扩展性。@haraldkl-我猜您有一些有力的证据支持此类语句?@pst,我知道这些库确实可以工作,但我并不是说应该对语法进行更改以提高性能:如果不进行这些更改,我会被拒绝,因为它们会导致更差的性能。是的,有证据支持这种策略。我并不是说,所有较新的功能都会对性能产生负面影响,或者说,您应该