与现代C ++相比,现代Fortran有什么优势? 您所在的位置:网站首页 fortran和python区别 与现代C ++相比,现代Fortran有什么优势?

与现代C ++相比,现代Fortran有什么优势?

2023-08-12 21:31| 来源: 网络整理| 查看: 265

我试图在Fortran和C ++之间决定科学计算中的应用程序。 对于我来说,尚不清楚Fortran在性能方面是否仍比其他语言更具优势。 例如,我相信由于Fortran强制执行严格的别名,因此与C99之前的C相比,编译器可以进行更好的优化。 我不确定C ++如何适合这里。

有指导吗?

相关讨论 " FORTRAN –"婴儿疾病" –已有近20年的历史了,对于您今天想到的任何计算机应用程序来说,这都是无可救药的:它太笨拙,风险太大,使用起来太昂贵了。" -Edsger Dijkstra,1975年。 我必须接受詹姆斯所说的。如果确实有任何优势,那么今天它们已经无关紧要了。 @James McNellis-Dijkstra有点疯狂。如果您能找到我从Dijkstra引用的语录作为他对语言的补充,我会接受它作为论据。 @TED:" LISP被开玩笑地描述为"滥用计算机的最智能方式"。我认为该描述是一个很好的称赞,因为它传达了解放的全部味道:它帮助了我们许多最有才华的人类思考以前不可能的想法。" -显然他喜欢Lisp ... "计算机科学的傲慢程度是用纳米Diijkstras来衡量的"-Alan Kay,1997年。 @ T.E.D .:一点。 @ T.E.D:(Whatever (his (attitude (might (have (been, (he (does (have (a (fair (point (against (LISP (syntax)))))))))))))))。 @James-这更适用:"当我阅读1961年出版的第一本手册Lisp 1.5手册时,我真不敢相信自己的眼睛。这是一种非常糟糕的语言。现在,它已成为AI社区的事实上的标准。 ,它现在遭受Lisp的折磨,就像世界其他地方一样遭受了Fortran的折磨" @ T.E.D .:我不禁怀疑这两个引号中的哪一个先出现... :) @James-一个大线索是,一个过去时态给出了,另一个没有。确切的答案是您给的是1972年的,我给了1985年的。 @ T.E.D .:好的,1985年的Dijkstra在1961年的Lisp 1.5手册上批评Lisp吗?多么及时。 @ T.E.D:我想到的编程语言有点像丘吉尔所说的那样,"民主是所有人中最糟糕的制度,除了其他所有人以外"(或类似的东西)。

我看了一下最新的Fortran标准中的一些内容,坦率地说,我印象深刻。我20年前讨厌这种语言的很多东西现在都消失了。没有更多的行号和特殊列(它们可能会在地狱中燃烧)。

Fortran已经在工程界广泛使用了50年。如果您在这些圈子中工作,那么会给您带来两个好处。首先,这些人非常关心优化。这意味着Fortran编译器倾向于拥有最好的优化器。由于缺少别名,该语言本身也比Cish语言更易于优化。

第二个优点是,Fortran的库支持数字运算根本无法被击败。最好的代码几乎总是会成为无需编写的经过良好调试的代码。

如果您的应用程序通常不属于科学,工程或数字运算的范畴,那么以上两种都不对您有什么大碍,因此您最好不去其他地方。

相关讨论 得益于restrict,在C语言中缺少别名的说法已不再是那么正确了。但是+1。 使用C ++的Fortran库没什么大不了的。而且C ++库甚至可能胜过Fortran,因为C ++支持更好的内联(尤其是基于模板的表达库)。因此,结果是使用一种有助于解决更高级别问题的语言;不确定C ++或Fortran是否合格... 注释中提到的问题有助于解决问题,但不能完全缓解问题。 Restrict是一个明显的改进,但是最好不要使用指针(从这个角度来看,const引用参数实际上是一个更大的问题)。但是至少它在攻击正确的问题。更好的C ++模板内联只会帮助缓解Fortran最初从未遇到的(许多)问题。 FWIW许多商用飞机系统代码(例如FMC,Nav系统等)仍依赖Fortran进行导航计算。不确定这是否仅仅是一个传统,还是不确定是因为数字处理是准确的,还是因为工程师是在FORTRAN上长大的,但是这些系统通常非常保守,并且具有多年的可靠性。编译器也很容易理解,这是支持运行这些安全关键系统的另一个因素。并不意味着您今天就跳入了Fortran,但是当您飞行时,Fortran可以帮助您保持安全!

另一个主要问题是学习曲线,这对于C ++而言非常大,而对于Fortran(90及更高版本)而言则异常小。 Fortran就像MATLAB一样,具有类似...

B'DB是matmul( matmul(transpose(B), D), B ) 向量的L2范数是norm2(x) 使用LAPACK的矩阵的SVD为call gesvd(A,S,u,vt)

Fortran还具有指针,动态内存,用户定义的数据类型等。

主要供应商(Intel / Sun / IBM / Cray / PGI / NAG等),开源(gfortan / g95)社区以及数字库/ API开发人员(例如PETSc,MPI等)都很好地支持它。

Heck认为新标准(Fortran 2008)甚至具有用于并行编程的协同阵列,而无需MPI / OpenMP,并且某些Fortran编译器已经支持它(g95和Cray)。

基本上,它具有数值计算所需的所有优良品质,比MATLAB容易,具有标准化,免费,可扩展(带有MPI / OpenMP和协数组)的功能,可产生快速的/并行代码。

对于数字来说,没有什么比Fortran更好,但是对于其他任何东西,不幸的是,一切都比Fortan更好。因此,如果您是一位工作安全的科学家,并且只进行数值/ HPC计算,那么请坚持使用Fortran,否则学习和使用C ++,因为它广泛用于非数值软件。

相关讨论 截至2011年1月,英特尔?Fortran编译器还支持协数组。

Fortran允许整个数组操作以及数组节上的操作。有用于数组的C ++类,但我认为您不能像在Fortran中一样容易地引用诸如x(:,2:,1:N3:2)之类的切片。这使人们可以非常简洁地表达一些算法。

Fortran数组操作的便利性扩展到派生类型的数组。假设您有一系列日期:

输入日期 整数::月,日,年 结束日期

类型(日期):: x(1000)

然后x表示日期数组,x%month表示月份数组,pack(x,x%month == 1)表示一月份的所有日期。有多少其他编程语言可以提供这种便利?

有关Fortran的较早评论("陈旧且令人作呕")有些偏颇,应相应予以打折扣。让我反对相反。在我看来,Fortran 90的免费格式看起来比C和C ++的语法更好,带有花括号和分号。遗弃它们或不正确地放入它们会导致C和C ++中的错误,而Fortran中没有这些错误。

Fortran已针对数学(尤其是矩阵)等运算进行了高度优化。

C ++已针对对象使用进行了高度优化。

这对您来说更重要。

如下所述,C ++具有优化的矩阵库。 但是Fortran的全部目的是优化数学过程(尤其是矩阵运算)。这些优化是基于语言(而不是库)的基础构建的,并且在基于C ++的研究方面大约有二十年的开端,这一事实使我感到怀疑(但不知道事实),Fortran将会在这一领域发展赢得胜利

相关讨论 近年来,尤其是在矩阵处理的C ++方面取得了进展。矩阵模板库中新的缓存感知算法。我不知道它们与Fortran相比如何,因为我从没想过驯服那只恐龙。 Fortrans的大部分优势将来自于编译器实现本身。 C ++的障碍实际上并不是内在的;它的大多数用户都不在乎其编译器中的紧密循环(矩阵)优化,因此,编译器编写者几乎没有像Fortran编译器编写者那样有动力进行此优化。 @ T.E.D .:此外,别名规则也不同,因此编译器可以更积极地优化。考虑矩阵乘法:在C ++中,某些操作以定义的顺序完成,而不管矩阵是否重叠。这意味着不可能自动并行化它,因为如果矩阵重叠可能会给出不同的结果。 Fortran编译器可以在这种情况下继续进行并行化处理,如果问题来自于重叠,则是您的错。

fortran95及更高版本优于c ++(2003):

如之前(由user4562所述)提到的学习曲线很短(我的第一语言是C,但我仍然无法掌握它,C ++也是如此) (我个人认为)很容易从Octave(就此而言,Matlab)的代码转换具有相似的语法,相同的模块化性(我可以使用Octave编写程序原型并以fortran95的速度进行重写),尽管您可以在C ++中直接使用octave代码。 动态内存分配非常简单(f77根本没有这个!) 库支持(您也可以在c ++中执行此操作,但是使用fortran是自然的) 对并行计算的共数组支持(仅可怜的cray支持它们,自2011年2月开始,gfortran从gfortran4.6开始工作,但还有很长的路要走)

简而言之,如果您的程序或应用程序完全是科学计算,请使用fortran 95;如果要计算少量数字只是故事的一部分,请使用C ++(或您认为更好的任何方法)

我在Fortran方面的经验是,它易于学习,清理(高度模块化),因此非常适合主要关注进行高度优化的数值计算的非程序员。尽管可以在c ++中执行同等的优化(甚至可能在更大程度上),但是要达到这些优化水平还需要大量的内在理解。当涉及矩阵计算时,即开即用的Fortran编译器通常会胜过c ++编译器。我还要补充一点,Fortran具有专门设计用来帮助程序员从数字例程中挤出更多性能的关键字。 C ++也有此功能,但在Fortran范围内没有。

另一个优点是Fortran并非特定于操作系统或体系结构。换句话说,您在一个操作系统或体系结构上编写的Fortran代码应轻松移植到具有Fortran编译器的另一操作系统或体系结构上。

另一个优点是,现代Fortran通常与Fortran的旧代码库向后兼容。多年来在Fortran中建立的代码库非常庞大且极为复杂(主要由科学家和数学家完成)。

另外,个人而言,我真的很喜欢内置的文件处理功能,该功能使您几乎可以立即读取数据文件并对其执行操作。 Fortran中的许多其他内置函数旨在提供这种便利。 C ++提供了主要的构建块来执行此操作,并且这需要花点时间才能读取数据文件b / c,您需要了解有关定界符的知识(Fortran允许您指定定界符)。

除此之外,我想不出优势。其他大多数事情都是字符串操作,或者是基于算法的操作,而c ++作为一种语言,通常来说,它是编译器,更适合并且大多数情况下性能会更好。一个有丰富知识的程序员可能会更喜欢c ++,因为他/她将了解如何以比Fortran编译例程更好的性能来优化数字例程。此外,可靠的Fortran编译器不如可靠的C ++编译器容易获得。

我是编程的新手。我从事有限元领域的编程已有一年左右。在网上进行了一些研究后,我决定使用fortran2003。通过学习查普曼的书,我在大约十天内学会了以模块化的方式进行编程。这是一年的时间,我已经以模块化格式(可维护,可重用和整洁的代码)编写了大约四千条代码行,根本没有使用任何字符变量。我不认为通过学习C ++,matlab,python,java ...十天,您将能够编写与fortran一样高效的数字代码。 fortran 2003还具有我现在正在学习的所有必需的OOP功能。 因此,就数字方面的语言强度而言,fortan不缺少任何东西(模块化样式,OOP样式,强大的数组功能,强大的库,免费的和商业化的最新编译器,非常易学,非常高效...)。诸如python / numpy之类的语言具有这些功能中的大多数,但缺乏效率。诸如C ++之类的语言也具有fortran的大多数功能(尽管对于数组计算而言,这是数值计算的主要核心,您必须导入一些库!),但是也许像我这样的人在fortran中编写的程序会比fortran效率更高。由一些具有10多年经验的c ++程序员编写的。 最后,我以fortran(模块化或OOP格式)进行大量的数值计算,并使用python numpy进行小型计算(如创建绘图,小型数组计算...)。

恕我直言,真正重要的唯一优点是对FORTRAN进行编程可让您更轻松地重用许多现有的FORTRAN代码和库。而且,如果您有50个FORTRAN程序员在一个有限的时间范围内完成一个项目,那么您是要首先教他们全部C ++,还是愿意接受让他们使用他们喜欢的语言?

相关讨论 您从技术上来说几乎是正确的。称其为"已安装基础"。这与" Wintel"框相比其他系统具有相同的优势,而C / C ++与其他系统编程语言相比具有相同的优势。不管有多么出色,已经存在太多的支持材料和思想共享,无法将它们放在适当位置。 +1这是考虑域空间时的重要因素。重用而不是重新发明的能力将导致更优化的代码和更短的开发周期。

鉴于已经进行了高度优化的LAPACK ++之类的科学计算软件包的存在,现代Fortran甚至没有性能优势。 C ++可能有其缺点,但性能不是其中之一。

相关讨论 LAPACK ++或其后续TNT都没有Fortran LAPACK包含的所有内容。尽管如此,它正在到达那里。 无论如何,最新的lapack版本3.3具有官方的C接口。

随着模板元编程(尤其是表达式模板)的出现,C ++在数值计算方面达到了FORTRAN的联盟,因此速度不再是一个问题。但是,关于其他问题,还有一些事情要说:

Pro FORTRAN:年长的人可能比C ++更了解它。 CONT FORTRAN:这是一种令人作呕的,古老的,几乎被废弃的语言,在您开始项目时就已经过时了。现在学习编程的人都不太可能学习FORTRAN,因此以后可能会遇到寻找该项目程序员的问题。

Pro C ++:这是相对较新的版本,编译器仍在不断进步。它使您可以编写表达力很强的代码。 Contra C ++:其中一些模板错误消息会让您哭泣。

相关讨论 +1错误消息让我哭了。 您是在谈论Fortran 2008,还是C ++甚至不存在之前的较旧版本之一?而且,我不认为C ++的速度劣势完全不是模板速度慢的问题。实际上,这是C ++编译器作者关心花时间改进其编译器的问题。 @ T.E.D .:我什至不知道他们仍在推进FORTRAN。无论如何,C ++并不会因为模板而变慢,但是TMP允许您编写非常有表现力的代码,这些代码在编译时会转换为允许优化器发挥更多功能的代码。在没有临时矩阵对象的情况下将矩阵操作编写为m1 * m2 * m3 -这就是TMP的作用。 @sbi-是的,我也没有,直到去年我被迫与一个项目进行互动。在那之前,我想和这里的其他人一样。它仍然不是我最喜欢的语言,但是它并没有像以前那样完全丧失。 我不相信断言"模板元编程的出现,C ++达到了FORTRAN的数学联盟"。我遇到的主要问题不是C ++的编译时问题,而是Fortran在专门用于数学的语言(尤其是矩阵处理)中建立的优化。 Fortran编译器对该领域进行了四十年的研究,而C可能具有优化功能,而这些优化都不是针对Fortran正在优化的相同方案而设计的, 我喜欢SO的摘要fortran比c快:基本上说这取决于。 +1以抵消匿名下注。 @Martin:我认为当今提高性能的主要方法主要是通过大规模并行化,而不是通过挤出优化的最后10%。如果您可以在图形卡上运行计算,那么您将击败所有针对传统CPU量身定制的编译器都可以实现的所有优化。现在这不是我的专业领域,所以如果我错了,请纠正我,但是我还没有听说CUDA随附FORTRAN绑定或OpenCL。但是,即使这样做-不管使用哪种语言,并行处理的主要优势仍然在于采用这种并行化。 无论如何,性能只是选择项目语言的一个要点,而Ive列出了其他几点。表现力同样重要,m3 = m1 * m2真的很难被击败。 OTOH,一旦您做错了事,编译器就会在23.8k错误消息中向您咆哮,这种表现力就会瓦解。问题是您是否要忍受这个或那个,权衡一个或多个。除了OP之外,其他任何人都无法做到这一点。 @sbi:当我想到科学计算和fortran台式机时,我就没想到了(因此对我而言CUDA无关紧要)。但是并行性是。 fortran编译器附带的每个硬性的多核系统(我已经看到)都是为并行而设计的。凭借其严格的别名规则,fortran更自然地是一种数据并行语言(比C ++),并且更容易被编译器并行化。我同意C ++非常善于表达与对象的关系(它旨在完成的工作)的意图。 Fortran擅长表达数学意图(通常不需要 ...程序员开始参与并行性(编译器工作)。 模板元编程的问题在于,由于它是代码生成的,它无法通过手工编写相同的代码来完成您无法完成的任何工作。由于Fortran可以比C或C ++更快地执行一些重要的计算(由于使用别名规则),因此保留了性能优势。 C ++确实在表达能力上占了上风,因为TMP可以提供很大的符号方便性,可以很容易地添加它们,而Fortrans的表达能力则更为有限。 @马丁:这很可能是对的(尽管我听说有科学家坚持使用FORTRAN为PC编写程序,因为"那是最好的")。正如我说的,这绝对不是我的专业领域,因此,我只感谢您的观点,然后鞠躬。 @sbi:我也不是专家。如今,随着超级计算机被联网的X-Box / PSP集群取代,最有效的语言可能正朝着另一种方向发展(使用CUDA)。自从我编写任何fortran以来已有20年了(我现在的选择是C ++,但这是因为我有能力比fortran更好地使用C ++)。 @David:TMP可以做的一件事是在编译时进行计算,并大规模内联结果代码。这可以在内部循环中产生很大的变化(尽管我原则上同意您的观点)。 -1,当然同意速度不是问题,但是赞成/反对论点非常差。您如何定义"令人作呕"?"旧的"与语言有什么关系?我还要指出,为您的项目找到程序员很容易,因为优点之一是Fortran相对简单。似乎更像是一种情感上的答案,但我想这就是这些非建设性问题所导致的。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有