是什么使Fortran快速?


41

Fortran在数值编程中占有特殊的位置。您当然可以使用其他语言来制作优质,快速的软件,但是Fortran虽已发展多年,但仍然保持着出色的性能。此外,在Fortran中编写快速程序更加容易。我已经用C ++编写了快速程序,但是您必须更加小心指针别名之类的内容。因此,必须有一个原因,并且是一个非常技术性的原因。是因为编译器可以优化更多吗?我真的很想知道技术细节,因此,如果我使用另一种语言,则可以考虑这些因素。

例如,我知道-或我认为-有一件事是,该标准指定指针在内存中始终是连续的,这意味着更快的内存访问。我相信您可以在C ++中通过向编译器提供标志来做到这一点。通过这种方式,有助于了解Fortran的优势,因此,如果使用其他语言,我们可以效仿。


7
我会说这对于stackoverflow可能是一个更好的问题,尽管我认为这是一个好问题。快速搜索(stackoverflow.com/search?q=fortran+fast)使我想到了一个可以帮助您的问题:stackoverflow.com/questions/146159/is-fortran-faster-than-c
Yann

3
您需要指定要使用的fortran类型。77和90+之间有很大的差异。我假设至少要说90个指针...
qubyte 2011年

我经常读到有关Fortran的速度比C快。也许吧,但是它快2%还是快50%?
shuhalo 2011年

4
这是都市神话。除非编译器可以使用特殊的指令,否则您可以手动优化几乎任何程序,而与编译器无关,以生成大致相同的机器语言。
Mike Dunlavey 2012年

Answers:


50

语言设计师面临许多选择。 肯·肯尼迪Ken Kennedy)强调了两个:(1)更好的抽象和(2)更高或更低级别的(更少或更多类似于机器的)代码。虽然像Haskell和Scheme这样的功能语言专注于前者,而传统的科学计算语言(如Fortran和C / C ++)却专注于后者。说一种语言比另一种语言快通常会产生误导:每种语言都有其擅长的问题领域。Fortran在基于数组的数字代码方面要比其他语言更好,这有两个基本原因:其数组模型和明确性。

阵列模型

Fortran程序员主要进行数组操作。为此,Fortran促进了其他语言无法提供的几种编译器优化。最好的例子是向量化:了解数据布局可以使编译器在数组上调用程序集级内在函数。

语言显性

尽管似乎一种较简单的语言应比较复杂的语言“更好”地进行编译,但实际上并非如此。当用汇编语言编写代码时,编译器无能为力:它所看到的只是非常细粒度的指令。仅在为基于数组的计算带来真正回报的情况下,Fortran才需要明确性(因此,程序员需要更多工作)。Fortran使用简单的数据类型,基本的控制流和有限的名称空间。相比之下,它没有告诉计算机如何加载寄存器(这对于实时而言可能是必需的)。Fortran 显式的,它启用了诸如完整类型推断之类的功能,可帮助新手入门。它还避免了使C变慢的一件事:不透明的指针

Fortran可能会变慢

Fortran 不能快速完成所有任务:这就是为什么很少有人将其用于构建GUI甚至用于高度非结构化的科学计算的原因。一旦离开了用于图形,决策树和其他领域的数组世界,这种速度优势就会很快消失。有关一些示例和数字,请参见计算机语言基准


7
通过使用“更通用的”语言包装Fortran运算可以轻松解决GUI / IO问题。为此,我经常使用R。
mbq 2011年

2
Shootout.alioth.debian.org不再可用!而且新版本的信息少得多:(
astrojuanlu 2015年

23

Fortran的设计允许编译器在某些情况下执行更强大的优化,这些优化通常不适用于C。

一个著名的例子是别名的处理。在Fortran中,只有与特定存储区关联的特定符号,您才能访问该特定存储区。这些知识使编译器可以在需要缓存时采用一些巧妙的技巧:它知道某个值是否已潜在更改。直到F90,这很容易验证。当推出Fortran 90时pointers,这一假设不再成立:您可以通过两个(或更多)符号访问相同的内存区域。这就是为什么必须指定target要通过指针寻址的数组的原因。

另一个有趣的事实是,许多构造允许编译器无需用户干预即可执行并行化。由于Fortran作为语言的相对“平台不可知论”,所以这种奢侈是可能的。

还有许多其他类似的技巧。此外,请记住,除了数值计算之外,今天没有人使用Fortran,这意味着Fortran编译器的核心功能和卖点是最终的代码速度。结果,供应商专注于此。

但是,您也可以使用其他语言来生成高性能代码。但是,它可能需要特殊护理或人为干预。但是,总的来说,直到出现问题,性能才是问题,而人工花费的时间比计算机花费的时间要昂贵得多。因此,编码实践应着重于节省人工,而不是计算机时间。


2
当您的计算机进入> 1亿美元的范围时,相比之下,人们的时间(研究生)不再显得那么昂贵。
菲尔·米勒

6
@Novelocrat:上运行的代码量$ 1亿的电脑已经写了无数的工时,这远远超出了$亿马克,甚至在研究生的价格。请记住,一个人的成本是其收入的两倍。其余的入税并相关。此外,计算机不会烧毁。一个人会做,并且会换工作。
Stefano Borini

1
@StefanoBorini我有经历过烧毁的PC的悠久历史……
N74,2015年

1
“此外,请记住,除了数值计算之外,今天没有人使用Fortran,” Fortran =“ FORmula TRANslation”。Fortran一直主要用于数字计算并设计用于数字计算。Fortran在高性能计算机上花费了大量时间。
user21387,

今天,与以往一样,Fortran用于所有相同目的-数值计算。
序列

12

我不认为Fortran如此接近金属(请参阅其他答案),但是它往往非常容易优化。循环很简单,语言很容易支持向量化扩展(好吧,当我在第一份工作中使用它时,我们的目标是各种各样的向量大铁器)。

还有很大的惯性因素。Fortran中包含许多数字代码,因此高端服务器和超级计算机的构建者确保他们编写良好的优化Fortran编译器。编译器很好(即使在相对缺乏高质量编译器的机器上),因此用户继续使用Fortran甚至在其中编写新代码。因此,构建器确保其下一代具有良好的编译器等。


8

注意这里的都市神话。如果两个编译器生成相同的汇编代码,则生成的程序将具有相同的性能。

对于任何给定的逻辑,都有一个汇编语言的程序可以最大程度地减少其执行时间。该程序不在乎是哪个编译器生成的。

也就是说,存在编译语言可以使程序员的生活更轻松。这样做的部分代价是,它们可能会诱使用户使用不会缩短执行时间的功能。最好的例子是new在C ++中。(它的速度有多慢-只有三个字符?)实际上是乞求您动态分配内存,而不必关注运行时成本。如果您要这样做,那就太好了,但是Fortran可能会更快,因为它并没有吸引您这样做。

但是除此之外,我从未见过一个程序,如它最初编写的那样,它并没有很大的性能提升空间,而这种性能是编译器永远无法为您解决的。例如,花费大量时间调用exp和/或log重复使用相同的参数。再举一个例子,调用DGEMM乘以矩阵并发现调用LSAME只是为了解密其输入字符参数会花费大量时间。

这是在人们同时说由于指针别名或循环展开而使Fortran更快的同时。这就像说保时捷制造的公共汽车肯定比雪佛兰制造的公共汽车要快。需要有一些常识。


4
我不认为这只是都市神话。Fortran对整个数组操作,PURE / ELEMENTAL函数等的支持可以帮助编译器轻松地优化/向量化甚至并行化。有关示例,请参阅thinkparallel.com/2007/08/14/…。编译器实际上所做的是一个不同的故事(取决于供应商)。
stali 2012年

@stali:这不仅取决于供应商。这取决于正在编译的程序。我已经看到人们从“存在一个可以让Fortran快速运行的程序”概括为“在任何程序上Fortran都更快”。如果您指出这一点,人们就可以开始下摆,修剪和分裂头发,而实际上最终归结为人们所想的。
Mike Dunlavey,2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.