如今,Fortran vs c 在数值分析中仍然具有任何优势

Fortran vs C++, does Fortran still hold any advantage in numerical analysis these days?

本文关键字:任何优 vs Fortran 如今      更新时间:2023-10-16

随着C 编译器的快速开发,尤其是Intel的编译器,以及在您的C/C 代码中直接应用SIMD函数的能力确实具有Fortran在世界上的真正优势数值计算?

我来自应用数学背景,我的工作涉及大量的数值分析,计算,优化等,以及严格定义的绩效要求。

我几乎对fortran一无所知,我在c/cuda/matlab上有一定的经验(如果您将后者视为一门计算机语言),而我的日常任务涉及对非常大的数据进行分析(例如10GB Large矩阵),看来该程序至少花费了2/3的时间来进行内存访问(这就是为什么我将其一些工作发送给GPU),您是否认为尝试尝试Fortran常规对我来说是值得的至少在我的代码中的某些至关重要的部分以提高程序的性能?

由于需要在那里涉及的复杂性和事情,所以只有在那里只有很大的性能益处,我才会去做。与C 相比,Fortran具有严格的混叠语义,并且数十年来一直在积极调整数值性能。使用CPU与数据阵列一起使用的算法通常有可能从Fortran实施中受益。

编程语言枪战不应过分认真,但是在15个基准中,fortran排名第一的速度为的速度(对于英特尔Q6600 One Core),比其他任何单曲都要多语言。您会看到,福特兰闪耀的基准是数值巨大的:

  • 光谱规范27%快速
  • Fasta 67%快
  • mandelbrot 56%快
  • PIDIGITS 18%快

反例:

  • K-核苷酸500%慢(该基准重点是更复杂的数据结构和弦处理,这不是Fortran的强度)

您还可以看到一个摘要页面"慢了多少次",该页面表明在所有实现中,fortran代码平均接近每个基准的最快实现 - 尽管量变条远大于C ,表明Fortran不适合C 擅长的某些任务,但您应该已经知道。

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

  1. 此功能的速度是否如此关键以至于在fortran中重新实现它是值得的吗?

  2. 表现如此重要,以至于我对学习Fortran的投资将获得回报?

  3. 是否可以使用像地图集这样的库而不是自己编写代码?

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

您决策的另一个因素是样本代码的量和可用的参考实现数量。Fortran的悠久历史意味着有大量的数值代码可供下载,甚至可以前往图书馆。与往常一样一些优点"。

c 也具有一些不同的优势。python,r等也是如此。它们是不同的语言。用一种语言做一些事情,在另一些语言中做一些事情变得更容易,更快。所有这些都是在其社区中广泛使用的,出于很好的理由。

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

fortran自然适合数值编程。您倾向于在此类程序中有大量数字,通常是布置的阵列。阵列是Fortran中的一流公民,将数字内核从Matlab转换为Fortran通常很简单。关于潜在的性能优势,请参见其他答案,这很好地涵盖了这一点。基线可能是您今天使用大多数编译的语言创建高效的数值应用程序,但是您可能会跳过一些循环到达那里。由于语言功能,Fortran经过精心设计,以允许编译器识别大多数优化位置。当然,您还可以使用任何编译语言(包括Fortran)编写任意慢速代码。无论如何,您应该选择适合的工具。fortran诉讼数值应用,C套件系统相关的开发。最后,学习Fortran基础知识并不难,而且要了解其他语言总是值得的。这对您要解决的问题打开了不同的看法。

还值得一提的是,fortran比C 容易得多。实际上,fortran的语言规格比普通c较短,它的语法可以说更简单。您可以很快捡起它。

这意味着,如果您只对学习C 或Fortran感兴趣,以解决您目前遇到的单个特定问题(例如,用原型语言撰写的内容加快瓶颈),Fortran可能会给您更好投资回报率。

fortran代码通常适用于矩阵和矢量类型操作。但是,您还可以通过将提示/建议传递给编译器以产生相似的质量向量说明,从而通过C/C 代码产生类似的性能。给我良好提升的一种选项不是假设数组对象的输入变量之间的内存别名。这样,编译器可以积极地进行内部循环展开和管道上的ILP,在此过程中它可以重叠负载并在环路迭代中与正确的预取相关。