【问题标题】:Why is fortran used for scientific computing? [closed]为什么将fortran用于科学计算? [关闭]
【发布时间】:2012-02-18 07:15:07
【问题描述】:

我听说 Fortran 仍然大量用于科学计算。对于已经大量投资于 Fortran 的代码,这对我来说很有意义。

但是,是否有理由在新项目中使用 Fortran 而不是其他现代语言?与更流行的语言(C++、Java、Python、Ruby 等)相比,Fortran 中是否存在使其更适合科学计算的语言设计决策?例如,与我提到的其他语言相比,Fortran 是否有特定的语言特性可以在编译器中实现更高程度的数值优化?

【问题讨论】:

  • 只是一个快速的民意调查:这里有人实际上在野外(而不是在学校)使用 Fortran 吗?这里有没有人认识使用它的人(第一手,不是你去年在酒吧遇到的一个家伙的朋友)?
  • @pawdiablo :我写过,我写过,我会写 Fortran 代码!因此,您不能再说您不认识任何使用 Fortran 的人 ;-)
  • @pawdiablo 是的。我是由几十名每天都使用 Fortran 的科学家组成的研究小组(一所大学的众多小组之一)的一员。
  • 我认为“在野外”意味着在吃奇多和减肥博士的同时穿着内衣编码。胡椒。
  • @paxdiablo - 是的,“在野外”使用它(在与学校或学术界没有关系的公司中)。

标签: fortran


【解决方案1】:

据我了解,有一些库是其算法可用的一些最有效的实现,这使得 Fortran 很受欢迎,尽管有语言的限制。

【讨论】:

  • 请问 Fortran 有哪些限制?我非常了解几种编程语言,例如 C、Fortran、JAVA。当我需要用图形部分编写交互式代码时,我选择了 JAVA。但是当我想用数组操作编写科学代码时,我选择了 Fortran。当我想编写一些需要计算机科学技巧的东西时,C 通常是最好的选择。
  • Fortran 是 1960 年代基于过程的语言,几乎没有现代语言功能。可以说它是类固醇的基础版(是的,我知道它早于基础版),几乎没有范围概念、算法控制结构和基本的 I/O 模型。例如,据称缺少变量初始化检查是导致美国卫星丢失的原因(变量名称拼写错误)。
  • @nfc-uk 您是否将 FORTRAN 66 与源自 90 年代的语言进行比较,应该与 Fortran 95 及更高版本进行比较? Fortran 编程是关于范围的,它有许多控制结构和 I/O,可与 C 相媲美,除了 C 之外还有自己的模式。
  • 这些库可以用其他语言包装,就像在 JuliaSciPy 中所做的那样。
  • @Grayscale:这样的包装器添加了一层间接层(无论多么薄),如果原始性能是您的目标,那么您不希望这样做。
【解决方案2】:

一个原因是数组的构造方式。与大多数其他语言不同,它们是列专业的。这为他们的计算提供了更快的计算速度。

【讨论】:

  • 切换索引的顺序不是比切换到其他语言更容易吗?
  • @jheld - 为什么你认为现在它是一种非常糟糕的语言?
  • 我不明白为什么索引的顺序会影响性能...如果您选择正确的算法,当然可能取决于该顺序。
  • 列专业与计算效率无关。
  • @IRO-bot:确切地说,物理内存无论如何都是线性的(一维),矩阵是逐列还是逐行存储都没有关系。然而,在循环中使用正确的、特定于语言的索引顺序很重要。否则代码会变得非常慢......
【解决方案3】:

无论好坏,Fortran 都是唯一专为科学数值计算而设计的主要语言。它的数组处理很好,在整个数组和切片上都有简洁的数组操作,可与 matlab 或 numpy 相媲美,但速度非常快。该语言经过精心设计,使意外编写慢代码变得非常困难——指针被限制在这样一种方式下,如果可能存在别名,作为标准示例,它会立即显而易见——因此优化器可以在你的代码。当前的版本有 coarray fortran 之类的东西,并且在语言中内置了并发和 forall,允许分布式内存和共享内存并行,以及矢量化。

Fortran 的缺点主要是上述优点之一的另一面; Fortran 历史悠久。好处:大量的优秀图书馆。缺点:成吨的历史包袱。

如果您必须进行大量数字运算,Fortran 仍然是首选之一,这就是为什么在世界各地的超级计算中心运行的许​​多最复杂的模拟代码都是用它编写的。但当然,用它来编写 Web 浏览器会是一种糟糕、糟糕的语言。每项任务都有它的工具。

【讨论】:

  • FORTRAN 传统上用于科学/工程数值计算,因为惯性和其他原因一样多,并且拥有许多专门的库。 FORTRAN 与 C 一样,是一个“超级汇编程序”,它可以让您接近金属,而无需添加大量绒毛以使编程更容易,或者保护您免受自己的伤害——为 Real Men(tm) 编程。它在编译器优化工作方面有着很长的历史,但没有理由其他语言不能使用这些优化中的大部分。它是在真正的语言/编译器科学出现之前设计的,并且显示了它的时代。
  • 我在任何其他语言中都没有做过我在 Fortran 中所做的 3 年 (CFD);此外,我不觉得任何“主要”语言(例如 Fortran/C/C++)的专家;但是,根据我对他们每个人的了解,我很难认为您提到的所有这些优势都很难获得,例如,通过一个编写良好的库在 C++ 中。总之,在我看来,科学数值计算社区大多在 Fortran 中,只是因为几乎没有完全愿意用更现代的语言重建这些功能。
  • 随着Julia (也许还有其他语言)。如果一个正在寻找一种语言来进行科学数值计算的新程序员在 2020 年选择 Fortran 而不是 Julia 之类的东西,那我会感到困惑。也就是说,Julia 仍然使用use Fortran under the hood 来实现它的某些功能......现在:)
【解决方案4】:

很少有项目是全新的项目。我不确定它是否特定于科学计算,但至少在这个领域,您倾向于基于现有(科学)模型构建您的应用程序,这些模型可能由其他团体/人生产。无论您是否愿意,您总是需要处理一些遗留代码。

Fortran 是许多科学家学习的工具,也是他们需要的许多库的实现方法。其中许多人可能不是计算机科学家或 IT 人员,更多的是计算科学家.他们的主要目标很少是计算,这是他们的科学第一。 虽然大量程序员一有机会(包括在业余时间)就会倾向于学习新的编程语言或框架,但大多数科学家会利用这段时间探索有关他们的科学的新想法。

受过 Fortran(或任何语言)培训并被处于类似情况的人所包围的领域专家将没有动力离开它。 不仅仅是现在其他语言在性能方面可以与 Fortran 一样好,它们需要好多更好:需要有充分的理由放弃你所拥有和知道的。

在某种程度上,这也是一个“恶性”循环。我一直觉得比较 Java 和 Fortran 有点困难,因为许多 Java 科学应用程序不是以 Java 方式编程的。一些Java Grande 基准测试应用程序看起来很像 Fortran 程序变成了 C 程序,复制/粘贴/调整到 Java 程序中(在一种方法中,将数组的长度作为数组本身旁边的额外参数传递会提供线索,如果我没记错的话)。正因为如此,Java(例如)在科学界并没有很好的声誉,尽管its performance is getting better。其结果是,例如,HPC 专家和 Java 专家之间几乎没有重叠。即使是硬件供应商或库实现者,用户的需求很少导致提供的支持也很少,这反过来又会阻止可能有兴趣转向其他语言的用户。

请注意,这并不妨碍相同(或其他)科学家将其他语言用于其他目的(例如工作流管理、数据管理、使用 Matlab、Numpy 进行快速建模......)。

【讨论】:

  • +1 获取论文链接。这是 .NET 的类似比较:ilnumerics.net/blog/… 它与网格无关,但这里 .NET 在 kmean 算法中甚至优于 Fortran!
  • “HPC 的 Java 现状”论文的链接已失效...我认为这是同一篇论文:docs.huihoo.com/proactive/ProActiveJavaStatusforHPC.pdf。但是,它是从 2008 年开始的,我找不到任何更新的东西......警告购买者
【解决方案5】:

对我来说,主要原因是漂亮的数组表示法,以及许多其他使编写和调试科学代码更容易的设计决策。就相关任务(数组操作)的性能而言,它通常是最佳选择,这一事实也无妨:)

老实说,我不会认为大多数被引用为 Fortran 真正竞争对手的语言——Java 和 Ruby 在便利性和性能方面都远远落后,而 C++ 过于复杂和棘手,无法推荐给任何人过去几年,他的主要工作除了日常的 C++ 编程之外的工作。不过,带有 numpy 的 Python 可能是一种选择。我个人不是该语言的忠实拥护者,但我认识一些经常使用 numpy 并且似乎对此很满意的人。

我看到的真正竞争不是来自这些,而是​​来自 Matlab、R 和类似的语言,它们提供了类似的便利,并结合了许多标准库。幸运的是,通常可以在 R 或 Matlab 中启动项目,然后在 Fortran 中编写性能关键部分。

【讨论】:

  • 你反对“竞争对手”,他们假设的速度很慢。这不是真的(不再)。此处的答案中给出了一些参考资料。由于计算机体系结构的演进,未来它甚至会变得不那么真实。或者你能想象,在 FORTRAN 中编写一个网格计算应用程序,在其节点上利用多核、SIMD 指令——甚至可能利用 GPU 能力......?当然,这是可能的,因此有些人会这样做。但他们这样做是在浪费时间。
  • 嗯,我不太确定您在这里指的是什么可能更好的选择?我怀疑我们是否会看到 java 或 ruby​​ 在 HPC 中越来越受欢迎——它们的目的完全不同。并且有很多网格应用程序是用 fortran 编写的(可能大约 50%,另一半是 C/C++)。你觉得什么更合适?PGI 加速器 fortran btw 在编程 GPU 方面出奇地好,我会在任何时候推荐它而不是 CUDA 以提高便携性。
  • 竞争正在慢慢开始:julialang.org
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-29
  • 2013-08-22
  • 2010-09-18
  • 1970-01-01
  • 2010-10-31
  • 2016-07-30
  • 2023-03-26
相关资源
最近更新 更多