Fortran与C++,Fortran现在在数值分析方面还占有优势吗?[已关闭]

wi3ka0sx  于 2022-12-27  发布在  其他
关注(0)|答案(5)|浏览(113)

已关闭。此问题为opinion-based。当前不接受答案。
**想要改进此问题吗?**请更新此问题,以便editing this post可以用事实和引文来回答。

5年前关闭。
Improve this question
随着C编译器(尤其是英特尔编译器)的快速发展,以及在C/C代码中直接应用SIMD函数的能力,Fortran在数值计算领域是否仍然拥有任何真实的的优势?
我有应用数学的背景,我的工作涉及大量的数值分析,计算,优化等,有严格的性能要求。
我对Fortran几乎一无所知,我对C/CUDA/matlab有一些经验(如果你认为后者是一种计算机语言的话),而且我的日常工作包括分析大量的数据(例如10 GB大矩阵),而且似乎程序至少花费2/3的时间在内存访问上(这就是为什么我把它的一些工作交给GPU),你们认为我至少在代码的一些性能关键部分尝试Fortran例程来提高程序的性能值得吗?
因为那里的复杂性和需要完成的事情,我只会在那里有显著的性能优势的情况下才执行该例程,提前感谢。

7vux5j2d

7vux5j2d1#

与C++相比,Fortran具有严格的别名语义,并且几十年来一直在积极地调整数值性能。使用CPU处理数据数组的算法通常有可能从Fortran实现中受益。
编程语言的竞争不应太过严肃,但在15个基准测试中,Fortran在 * 4 * 个(英特尔Q6600单核)上的速度排名第一,超过了任何其他语言。您可以看到,Fortran的亮点是大量的数字基准测试:

  • x1e0 f1速度提高27%
  • x1e1 f1速度提高67%
  • x1e2 f1速度提高56%
  • x1e3 f1速度提高18%

反例:

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

您还可以看到一个摘要页面“how many times slower“,它显示在所有实现中,Fortran代码平均而言最接近每个基准测试的最快实现--尽管分位数条比C大得多,这表明Fortran不适合C擅长的某些任务,但您应该已经知道了这一点。
因此,您需要问自己的问题是:
1.这个函数的速度是否如此关键,以至于值得我花时间在Fortran中重新实现它?
1.性能是否如此重要,以至于我在学习Fortran方面的投资会得到回报?
1.有没有可能使用像ATLAS这样的库来代替自己编写代码?
回答这些问题需要对代码库和业务模型有详细的了解,所以我无法回答这些问题。但是,Fortran实现通常比C++实现更快。
另一个决定因素是样本代码的数量和可用的参考实现的数量。Fortran强大的历史意味着有大量的数字代码可供下载,甚至可以去库中查找。与往常一样,您需要从中筛选出好的代码。

7ajki6be

7ajki6be2#

对您的问题完整而正确的回答是“是的,Fortran确实拥有一些优势”。
C++也有一些不同的优势。Python、R等也是如此。它们是不同的语言。用一种语言做一些事情更容易、更快,用另一种语言做一些事情。所有这些都在各自的社区中广泛使用,而且有很好的理由。
在没有更具体问题的情况下,任何其他问题都只是噪音和语言战争的诱饵,这就是为什么我投票结束这个问题,并希望其他人也这样做。

jmo0nnb3

jmo0nnb33#

Fortran天生就适合数值编程。在这样的程序中,你往往会有大量的数字,通常是排列好的数组。数组是Fortran中的头等公民,将数值内核从Matlab转换成Fortran通常是相当直接的。关于潜在的性能优势,请参阅其他答案。很好地涵盖了这一点。基线可能是你可以用当今大多数编译语言创建高效的数值应用程序,但是你可能会跳过一些循环到达那里。由于语言的特性,Fortran被精心设计成允许编译器识别大多数优化点。当然,你也可以用任何编译语言编写任意的慢代码,包括Fortran。在任何情况下,你都应该选择合适的工具。Fortran适合数值应用程序,C适合与系统相关的开发。最后一点,学习Fortran基础并不难,学习其他语言总是值得的。这将为你想解决的问题打开一个不同的视角。

t1rydlwq

t1rydlwq4#

另外值得一提的是Fortran比C更容易掌握。事实上,Fortran的语言规范比普通C语言更短,语法也更简单。你可以很快学会它。
这意味着,如果您对学习C
或Fortran只感兴趣,以解决当前遇到的一个特定问题(例如,加快解决用原型语言编写的程序中的瓶颈),Fortran可能会给您带来更好的投资回报。

tyky79it

tyky79it5#

Fortran代码通常更适合矩阵和向量类型的运算。但是你也可以通过向编译器传递提示/建议来产生类似质量的向量指令,从而产生与c/c++代码类似的性能。给我带来很好提升的一个选择是不假设数组对象输入变量之间的内存别名。这样,编译器可以积极地为ILP进行内部循环展开和流水线化,其中它可以利用正确的预取来在循环迭代上重叠加载和存储操作。

相关问题