作为FORTRAN老用户忍不住来撕一下。
FORTRAN就是用来把公式敲到程序中去的,像我们写的CFD代码,根本没有嵌套多层的函数,也没有什么复杂的程序结构,一个SUBROUTINE几千行,全是加减乘除的式子,要什么面向对象呢?
另外FORTRAN本身的编辑逻辑非常简单,数组就是数组,变量就是变量,从数组中取哪个数就是取哪个数,没什么指针移位什么的。全局的数组在SUBROUTINE或者FUNCTION之间传递非常直观,许多函数都去操作全局数组也不会出错。
编译器里的指令级的SIMD向量化是针对最底层的,所以我才不要什么外部的数学库,我需要我们自己写的DO循环是那个被向量化的最底层,许多FORTRAN程序员的习惯恰好满足了这一点。我们是不介意连FFT都自己写的,我们组的程序除了MPI以外没有使用任何外部的库,所以并行粒度到哪个层面就很清楚,可以AVX+openMP+MPI混用。并且作为算法研究,我需要知道计算中所发生的一切,依赖外部的库总是感觉心里没底。
很多人说的FORTRAN的矩阵操作很方便,在我们这里也是不存在的。CFD在某些阶段(甚至是很高的层面上)是需要求解线性方程组不假,但是这种超大的稀疏矩阵根本不是靠库函数直接求逆或者直接做矩阵向量乘法的,甚至根本没有存储过整个系数矩阵。每个元素具体的算法几乎全部是手敲进去,花上百行去实现一个格式算出一个系数,最后用一行乘掉拉倒,根本没有显式的矩阵运算。向量操作倒是偶尔用一下,省一个DO而已。所以很多人理解的所谓FORTRAN矩阵操作方便的优势,在我看来并不是主要原因。
有人说应该权衡一下,牺牲一点程序性能来节省编程的时间,我觉得说的很对,但在不同领域这个平衡点是不一样的。像我们CFD领域,有时在集群上等一个结果有时要数月,大家还都在排队,所以程序运行速度绝对是非常重要的。机时是很大的成本,你的程序效率太低,收益与成本不对称,可能连挂上去的机会都没有。商业领域也是一样的,计算服务器也是成本,跑得快的程序直接意味着真金白银的成本节省,这是那些“立等可取”的应用所无法想象的。
我的感觉就是敲式子并不难,式子本身是什么才更重要。FORTRAN程序员都不认为自己是程序员,而都说自己是搞计算的,懂的人自然知道“搞CFD的”和“用CFD做研究的”是完全不同的概念,前者更牛一些,大佬级的也多为前者。不需要把研究员逼成专业程序员,就能把算法实现得挺好挺快,我想这就是FORTRAN存在的价值。大佬们需要,这就够了。
当然,FORTRAN面向的用户也越来越窄了,因为计算机不再是尖端科学计算的专属,已经“飞入寻常百姓家”了。什么人都在编程,就一定会有程序员出来造反,“要革FORTRAN的命”,这也是正常的。事实上目前坚持在用FORTRAN的都是大几十年的传统学科(而且是超大规模计算的那种,比如各种流体计算,航空航天的、核爆的、气象的等等),看来来像是小众用户了,但是仍然是很有钱的少数。目前基本只有intel和NVIDIA(买了原来的PGI)两家硬件商还在做,因为高性能计算是他们的大客户,那些超级计算机上也是离不开FORTRAN的。
我也用CUDA,它也是直接针对高性能计算的,为我节省了很多的计算成本(自己独占GPU机器不用排队爽歪歪),但是用CUDA做CFD真的非常小众,需要适应的过程,也经历了被神话和被质疑的过程。FORTRAN的定位某种程度上讲也是类似的。试想你用C++鄙视CUDA,认为CUDA应该消失,有意思么?
“FORTRAN灭亡论”可以休矣。