Answers:
通常,选择取决于(1)您要解决的问题,(2)您的技能以及(3)与您一起工作的人(除非这是一个单独的项目)。我暂时将(3)放在一边,因为这取决于每个人的具体情况。
问题依存关系:Fortran在数组处理方面表现出色。如果您的问题可以用简单的数据结构(特别是数组)来描述,则Fortran可以很好地适应。即使在非显而易见的情况下(例如代表图形),Fortran程序员最终还是使用数组。C ++更适合复杂和高度动态的数据结构。
技能依赖:编写良好的C ++程序比编写良好的Fortran程序需要更多的编程经验。如果您从很少的编程经验入手,而只有太多的时间来学习工作的这一方面,那么与学习C ++相比,学习Fortran可能会获得更好的投资回报。当然,假设您的问题适合于Fortran。
但是,编程不仅限于Fortran和C ++。我建议所有从事计算科学的人从动态高级语言(例如Python)开始。永远记住,您的时间比CPU时间更有价值!
我认为C ++和Fortran都足够好并且可以很好地工作。
但是,我认为Fortran更适合数字科学计算,可以使用数组表示且不需要其他复杂数据结构的算法,因此在诸如有限差分/元素,PDE求解器,电子结构计算等领域。Fortran是特定于域的语言。特别是,我认为,由科学家(不一定是计算机科学专家)用Fortran 编写快速程序比用C ++ 编写容易。
C ++是一种通用语言,因此可以在其中表达任何算法,并且对于无法使用数组表达的算法(从HPC领域,可能是一些图形,网格生成器,符号处理等)来说,它绝对是更好的选择。
也可以用C ++编写数组算法,但是以我的经验,它需要更多的计算机科学知识,并且通常需要更多的工作(即,需要创建或重用类以进行数组操作,以及手动或使用一些内存管理方法。库,例如Trilinos的Teuchos)。非专家通常会编写相当不错的Fortran程序,但会编写糟糕的C ++程序(以我的经验为依据)。
免责声明:我个人非常喜欢Fortran,对于数字计算,我更喜欢它而不是C ++。我每天花2年以上的时间用C ++进行编程,而每天用现代Fortran进行的编程(在有限元素区域中)花费了将近一年。我也经常使用Python和Cython。
我还花了两分钱,但是我只是看过这个话题,所以我觉得,为后代,有一些急切需要提出的观点。
请注意,在下文中,我将讨论C而不是C ++。为什么?好吧,否则,将成熟的动态类型化的面向对象语言与像Fortran这样的静态语言进行比较的人就成了苹果。是的,最新的Fortran标准的一些现代实现不仅可以做更多的事情,但是实际上很少有人使用它们,因此,当我们谈论Fortran时,我们会想到简单,静态和命令式语言。那也是C的所在,因此下面我将用C ++替换C。
首先,关于具有更好的编译器的Fortran / C的讨论都没有意义。专用的C / Fortran编译器已成为过去。gcc / gfortran和icc / ifc只是同一后端的不同前端,即,您的程序将由前端转换为抽象描述,然后由后端进行优化和组装。如果以语义方式用Fortran或C语言编写相同的代码,则在两种情况下,编译器都将产生相同的程序集,其运行速度将相同。
现在这引出我的第二点:为什么我们仍然看到差异?问题在于,大多数比较都是由Fortran程序员尝试使用C进行的,反之亦然。是否曾经注意到大多数作者或诗人更喜欢用母语写作?您是否想用一种不完全自信或不自在的语言写诗?当然不是。我自己认为C是我的“本机”编程语言。但是,我确实也花了三年的时间在一个仅使用Fortran的小组中工作,在该小组中我达到了一定的流利程度。但是,我永远不会在Fortran中自己写任何东西,因为我对C更加满意,因此无论您将其定义为什么,结果代码都会更好。
所以主要的区别在于程序员,而不是语言。所以没有区别吗?好吧,不完全是。这里有一些例子:
SIMD:无论是SSE,SSE3还是AltiVec,如果您想在Fortran中使用它们,您最好希望并祈祷编译器准确地猜测出您想要的东西并这样做。祝好运。在C语言中,您通常具有每种体系结构的固有功能,或者最近具有gcc中的常规SIMD矢量类型。大多数Fortran编译器仅使用SIMD指令展开循环,但是如果您有一个以非显而易见的方式处理短数据向量的内核,则编译器很可能看不到它。
不同的硬件体系结构:整个CUDA体系结构都是基于C内核构建的。是的,波特兰集团现在也具有支持CUDA的fortran编译器,但它是商业化的,而且最重要的是,它不是来自NVIDIA。OpenCL也是如此,我能找到的最好的是最近的项目,该项目仅支持一些基本调用。
并行编程:是的,MPI和OpenMP在C和Fortran上都可以正常工作。但是,如果您想真正地控制线程,即如果您具有完全动态的共享内存计算,那么Fortran会让您感到烦恼。在C语言中,您拥有标准的pthread,尽管这些线程并不温暖且模糊,但仍然可以帮助您度过难关。通常,大多数依赖操作系统访问的计算(例如线程,进程,文件系统等)最好与C配合使用。哦,不要尝试使用Fortran进行自己的联网。
易于使用:Fortran比C更接近Matlab。一旦掌握了所有不同的关键字以及如何声明变量,其余的代码就类似于Matlab,从而使编程经验有限的用户可以更容易地访问它。
互操作性:在C语言中创建结构时,实际数据的布局是直接且确定的。在Fortran中,如果使用指针数组或结构化数据,则数据的实际布局在很大程度上取决于编译器,而不是直截了当的,并且通常是完全未记录的。您可以从Fortran调用C,反之亦然,但不要开始认为将静态数组从一个数组传递到另一个数组再传递回来可能并不那么容易。
这些都是令人讨厌的低级内容,但这是我们正在谈论的高性能计算,对吗?如果您对如何最好地利用底层硬件范例不感兴趣,即实现和/或开发最适合共享/分布式内存,线程,SIMD矢量化,使用SIMT的GPU等的算法,那么您就是只是在计算机上做数学。
这已经比我所想的要长得多,所以这里是一个摘要-一系列带回家的消息:
我的方法是对计算内核以外的所有事物都使用C ++,这通常最好用汇编语言编写。这可以为您带来传统HPC方法的所有性能,但可以简化接口,例如,将SGEMM / DGEMM / CGEMM / ZGEMM之类的计算内核重载到单个例程中,例如Gemm。显然,可以通过避免使用原始指针并切换到不透明类来提高抽象级别,但这是一个不错的第一步。
我发现C ++最大的缺点是编译时间的增加,但是以我的经验,节省的开发时间远远不能弥补。另一个缺点是,与C和Fortran编译器相比,C ++编译器往往具有更多的错误。在过去的一年中,我认为我在C ++编译器中遇到了将近十个错误。
综上所述,我认为撤销以低级语言(和Fortran)编写的科学软件包的做法是不愿公开用于复杂数据结构的便捷接口:大多数人都对Fortran BLAS接口感到满意,因为它只需要用来描述矩阵的指针和前导维,但是很少有人会争辩说,通常的40整数Fortran稀疏直接求解器接口几乎很方便(参见UHM,SuperLU,PETSc和Trilinos)。
总而言之,我主张对低级计算内核使用汇编语言,而对其他所有语言使用高级语言,尤其是对非平凡的数据结构进行操作时。
因为我是新来的,所以我一直在浏览旧问题并找到了这个问题。希望回答旧问题不是禁忌!
既然没有人提到这件事,我想。大多数主要的编译器(intel,ibm,cray,NAG,PCG)几乎都完全支持 Fortran 2003 ,甚至还有即将推出的最新版本4.7的gcc。Fortran 2003(和2008)是一种面向对象的语言,尽管比C ++更为冗长。我认为Fortran的优点之一是,标准委员会将科学计算视为其主要受众(我感谢Damian Rouson前几天向我指出了这一点)。
我并不是为了使C ++程序员成为Fortran程序员,而是为了让Fortran的人们知道他们现在除了切换到C ++或在Fortran 90/95中模拟面向对象的概念外,还有更多选择。
我要补充的一个警告是,处于编译器实现的最前沿的代价是代价。如果您现在在Fortran 2003中进行一个大型项目,您会偶然发现bug,并不断需要更新编译器(特别是如果您使用gcc),尽管在过去几个月中,这种情况已经大大改善了!
C ++的问题在于,您有很多机会破坏性能,例如盲目地使用STL,异常,类(虚拟开销和对齐问题),运算符重载(冗余的新/删除)或模板(无休止的编译和错误)看起来不错,但是您可以这样浪费时间)。
但是,更多的人可以更好地访问通用库,并且可以更好地查看代码(尽管这在很大程度上取决于字段,并且您仍然拥有纯C语言)。您仍然可以通过将其代码包装在脚本语言(例如R,Lush,Matlab / Scilab甚至Python,Ruby或Lua)中来弥补Fortran的灵活性不足。
三个事实:
C语言中的F77样式n维数组:使用CnD没问题(诚然,一个无耻的插件)
F90的模块系统设计欠佳,对构建环境不利。(例如,模块的名称不必与文件名匹配)
个人印象:
transfer()
,我们来了)Fortran已针对数组/矩阵计算进行了优化,并且对于任何类型的文本解析都非常麻烦。C和C ++在数值计算上可能无法与Fortran匹配(接近),但是我发现使用C / C ++处理文本和组织数据(即自定义数据结构)要容易得多。
正如其他人所提到的,不要指望动态解释语言(Python等)。它们可能无法提供Fortan的正面融化速度,但是它们使您可以将精力更多地放在解决计算问题上,而不是实现的所有细节。通常,您可以使用Python实现解决方案,如果性能不可接受,请进行一些性能分析,确定问题区域,然后使用Cython优化该代码或以编译语言重新实现整个程序。一旦解决问题的逻辑充实了,剩下的只是实现,并且在对计算基础有所了解的情况下,应该可以很容易地以任何一种编程语言来表示。
不好意思,我想挖一个旧线程,但即使在2015年,Fortran仍被大量使用。
我只是碰到了这个(替代链接)列表,该列表基本上是由美国能源部的OCLF设施批准的,在300 petaFLOPS Summit机器上运行的13个代码的清单,该机器将于2018年提供给研究人员。我试图找到使用的主要语言代码(基于谷歌快速搜索),这是我发现的内容:
XGC Fortran
SPECFEM Fortran
ACME Fortran (Bunch of climate codes)
DIRAC Fortran (Mostly)
FLASH Fortran
GTC Fortran
HACC C/C++
LS-DALTON Fortran (some C)
NAMD C/C++
NUCCOR Fortran
NWCHEM Fortran
QMCPACK C++
RAPTOR Fortran
因此,在13个代码中,至少有10个(根据我的快速搜索)似乎是用Fortran编写的。对于50岁的语言来说还不错。
注意:我很清楚,语言比较是没有用的,但是考虑到Fortran不好的人(特别是C ++用户)的数量,我认为值得一提。
杰克·P·我想说的是,您应该混搭。精心设计了一个好的软件。不同的层可以更自然或更有效地映射到不同的语言。您应该为每个图层选择最合适的语言。您还应该了解语言如何进行互操作,这可能会影响您为哪一层选择的语言。
一个更好的问题是,有哪些优秀设计的软件实例值得研究,以学习如何设计分层软件。