Fortran与C ++,现在的Fortran在数值分析方面还有什么优势?

随着C ++编译器,特别是intel的快速发展,以及在你的C / C ++代码中直接使用SIMD函数的能力,Fortran在数值计算领域还有什么真正的优势呢?

我来自math应用背景,我的工作涉及到大量的数值分析,计算,优化等等,有严格定义的性能要求。

我对Fortran几乎一无所知,我在C / CUDA / matlab方面有一些经验(如果你认为后者是一种计算机语言),我的日常任务包括分析非常大的数据(例如10GB大matrix),看起来这个程序至less花了2/3的时间在内存访问上(这就是为什么我把它的一些工作交给GPU),你们认为这对我来说可能是值得的一些性能关键的部分我的代码来改善我的程序的性能?

因为那里需要完成的复杂性和事情,如果只有在那里有显着的性能上的好处,我才会去做这个例程。

与C ++相比,Fortran具有严格的别名语义,并且数十年来一直在积极调整数值性能。 使用CPU处理数据数组的algorithm通常可能受益于Fortran实现。

编程语言大战不应该太过重视,但是在15个基准testing中,Fortran在其中四个 (对于Intel Q6600单核)速度方面排名第一,比其他任何一种语言都要高。 您可以看到Fortran闪耀的基准数字非常庞大:

  • 光谱范数快27%
  • fasta快67%
  • mandelbrot快56%
  • pidigits快18%

反例:

  • k-核苷酸慢了500%(这个基准主要集中在更复杂的数据结构和string处理上,这不是Fortran的强项)

您还可以看到一个总结页面“ 慢了多less ”,表明在所有实现中,Fortran代码平均接近每个基准testing的最快实现 – 尽pipe分位数条比C ++大得多,表明Fortran不适合C ++擅长的一些任务,但是您应该已经知道了。

所以你需要问自己的问题是:

  1. 这个函数的速度如此重要,以至于在Fortran中重新实现它是值得我的时间的吗?

  2. 性能如此重要,以至于我在学习Fortran方面的投资将获得回报?

  3. 是否有可能使用类似ATLAS的库而不是自己编写代码?

回答这些问题需要详细了解您的代码库和业务模型,所以我无法回答这些问题。 但是,是的,Fortran实现通常比C ++实现更快。

您决定的另一个因素是示例代码的数量和可用参考实现的数量。 Fortran历史悠久,意味着有丰富的数字代码可供下载,甚至可以去图书馆旅行。 像往常一样,你需要通过筛选来find好东西。

你的问题的完整和正确的答案是,“是的,Fortran确实有一些优势”。

C ++也具有一些不同的优点。 所以,Python,R等等,他们是不同的语言。 用一种语言做一些事情更容易,也更快一些。 所有这些都在他们的社区广泛使用,并有很好的理由。

其他任何事情,如果没有更具体的问题,只是噪音和语言战争诱饵,这就是为什么我投票结束这个问题,并希望其他人也会。

Fortran自然适合数值编程。 在这样的程序中,你往往有大量的数字,通常是排列的数组。 数组是Fortran中的头等公民,将数值内核从Matlab转换为Fortran通常是非常简单的。 关于潜在的性能优势,请参阅其他答案,这很好地涵盖了这一点。 基线很可能可以创build当今大多数编译语言的高效数值应用程序,但是您可能会跳过一些循环以达到目的。 由于语言特性,Fortran经过精心devise,使编译器能够识别大部分优化点。 当然你也可以使用任何编译语言(包括Fortran)编写任意慢的代码。 无论如何,你应该select合适的工具。 Fortran适合数值应用,C​​适合系统相关开发。 最后要说的是,学习Fortran的基础知识并不困难,总是有必要查看其他语言。 这对你想解决的问题提出了一个不同的观点。

另外值得一提的是,Fortran比C ++更容易掌握。 实际上,Fortran的语言规范比普通的C语言更短,而且它的语法可以说是比较简单的。 你可以很快拿起它。

这意味着,如果您只想学习C ++或Fortran来解决您目前遇到的一个具体问题(比如说,为了加速您用原型语言编写的东西的瓶颈),那么Fortran可能会为您带来更好的投资回报。

一般而言,Fortran代码对matrix和向量types操作更好。 但是你也可以通过向编译器传递提示/build议来产生类似的质量向量指令来产生与c / c ++代码类似的性能。 一个让我提高性能的方法是不要在数组对象的inputvariables中假设内存别名。 通过这种方式,编译器可以积极地为ILP进行内部循环展开和stream水线处理,在这里它可以重叠加载,并在循环迭代中存储操作,并具有正确的预取。