Fortran与C++;,现在Fortran在数值分析方面还有什么优势吗? 随着C++编译器的发展,特别是英特尔编译器的快速发展,以及在C/C++代码中直接应用SIMD函数的能力,FORTRAN在数值计算领域中是否仍然占有真正的优势?

Fortran与C++;,现在Fortran在数值分析方面还有什么优势吗? 随着C++编译器的发展,特别是英特尔编译器的快速发展,以及在C/C++代码中直接应用SIMD函数的能力,FORTRAN在数值计算领域中是否仍然占有真正的优势?,c++,c,cuda,fortran,C++,C,Cuda,Fortran,我有应用数学背景,我的工作涉及大量数值分析、计算、优化等,并有严格的性能要求 我几乎不了解FORTRAN,我在C/CUDA/Matlab中有一些经验(如果你把后者作为计算机语言来开始),并且我的日常任务包括分析非常大的数据(例如10GB的大矩阵),并且看起来程序至少花费2/3的时间在内存访问上(这就是为什么我把它的一些工作发送给GPU),你们认为对我来说,至少在代码的某些性能关键部分尝试fortran例程来提高程序的性能值得吗 因为在这里涉及的复杂性和需要做的事情,如果只在那里有显著的性能优势,

我有应用数学背景,我的工作涉及大量数值分析、计算、优化等,并有严格的性能要求

我几乎不了解FORTRAN,我在C/CUDA/Matlab中有一些经验(如果你把后者作为计算机语言来开始),并且我的日常任务包括分析非常大的数据(例如10GB的大矩阵),并且看起来程序至少花费2/3的时间在内存访问上(这就是为什么我把它的一些工作发送给GPU),你们认为对我来说,至少在代码的某些性能关键部分尝试fortran例程来提高程序的性能值得吗


因为在这里涉及的复杂性和需要做的事情,如果只在那里有显著的性能优势,我将只例行公事。

< P> Fortran与C++相比具有严格的混叠语义,并且几十年来一直在积极地调整数值性能。使用CPU处理数据数组的算法通常有可能从Fortran实现中获益

编程语言的冲突不应该太严重,但在15种基准测试中,Fortran在其中四种(英特尔Q6600单核)上的速度排名第一,超过了任何其他单一语言。您可以看到,Fortran的亮点在于大量的数字基准:

  • 快27%
  • 快67%
  • 快56%
  • 快18%
反例:

  • 速度慢500%(此基准测试主要关注更复杂的数据结构和字符串处理,这不是Fortran的强项)

你也可以看到一个概要页面“”,它显示了在所有实现中,FORTRAN代码平均最接近每个基准的最快实现——尽管分块条比C++大很多,这表明FORTRAN不适合C++所擅长的某些任务,但是您应该已经知道了。 因此,你需要问自己的问题是:

  • 这个函数的速度如此关键,以至于用Fortran重新实现它值得我花时间吗

  • 性能如此重要,以至于我在学习Fortran方面的投资会有回报吗

  • 可以使用ATLAS这样的库而不是自己编写代码吗

  • 回答这些问题需要详细了解您的代码库和业务模型,所以我无法回答这些问题。但是,是的,FORTRAN实现通常比C++实现快。
    决定的另一个因素是示例代码的数量和可用的参考实现的数量。Fortran强大的历史意味着有大量的数字代码可供下载,甚至可以去图书馆。像往常一样,你需要筛选它以找到好的东西。

    Fortran自然适合于数值编程。在这样的程序中,往往会有大量的数字,通常是排列的数组。数组是Fortran中的一级公民,将Matlab中的数值内核转换为Fortran通常非常简单。 关于潜在的性能优势,请参阅其他答案,这些答案很好地涵盖了这一点。基线可能是您可以使用当今大多数编译语言创建高效的数值应用程序,但您可能需要跳过一些循环才能实现这一点。Fortran经过精心设计,使编译器能够识别大多数优化点,这是由于它的语言特性。当然,您也可以使用任何编译语言(包括Fortran)编写任意慢代码。
    在任何情况下,你都应该选择合适的工具。Fortran适合数值应用,C适合系统相关开发。最后一句话,学习Fortran基础并不难,而且研究其他语言总是值得的。这就为您想要解决的问题打开了一个不同的视角。

    对于您的问题,完整而正确的答案是,“是的,Fortran确实有一些优势”

    C++还有一些不同的优势。Python、R等也是如此。它们是不同的语言。用一种语言做一些事情,用另一种语言做一些事情更容易、更快。所有这些都在他们的社区中广泛使用,理由非常充分


    在没有更具体的问题的情况下,任何其他事情都只是噪音和语言战争诱饵,这就是为什么我投票赞成关闭这个问题,希望其他人也会这么做的原因。

    也值得一提的是FORTRAN比C++更容易掌握。事实上,Fortran的语言规格比普通C语言短,而且它的语法可以说更简单。你可以很快地把它捡起来


    这意味着,如果你只对学习C++或FORTRAN感兴趣,以解决目前唯一的一个特定问题(例如,为了加速在原型语言中编写的东西的瓶颈),FORTRAN会给你更好的投资回报。但是,通过向编译器传递提示/建议以生成类似质量的向量指令,也可以使用c/c++代码生成类似的性能。一个给我带来很大提升的选项是,不要假设作为数组对象的输入变量之间存在内存混叠。通过这种方式,编译器可以积极地为ILP进行内部循环展开和管道化,在这种情况下,它可以通过正确的预取在循环迭代中重叠加载和存储操作。

    Fortran得益于没有别名,因此它可以更积极地进行优化。在C99中,您可以