fortran还是python_Fortran 还有存在的必要吗?

作为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灭亡论”可以休矣。

PythonFortran的混合编程可以通过使用F2PY(Fortran to Python)工具来实现。F2PY是一个用于将Fortran代码转换为Python可调用模块的工具,它可以将Fortran代码编译成Python模块,使得Python代码可以调用Fortran代码。 以下是Python封装Fortran的步骤: 1. 编写Fortran代码,并创建一个Fortran模块文件。例如,假设我们有一个Fortran程序文件`test.f90`,其中包含一个名为`add`的子程序,它可以计算两个整数的和。我们可以使用以下命令编译Fortran代码,生成一个名为`test_module.so`的共享库文件: ``` f2py -c -m test_module test.f90 ``` 2. 在Python中导入创建的Fortran模块。可以使用以下代码: ```python import numpy as np from test_module import add a = np.array([1, 2, 3]) b = np.array([4, 5, 6]) c = add(a, b) print(c) ``` 在上述代码中,我们首先导入了Numpy库和我们创建的Fortran模块`test_module`中的`add`子程序。然后,我们使用Numpy创建了两个数组`a`和`b`,并将它们作为参数传递给`add`子程序。最后,我们打印输出结果。 注意,在使用F2PY封装Fortran代码时,需要将Fortran代码中的变量类型和Python中的变量类型进行匹配。同时,还需要考虑Fortran代码中的数组是按列存储还是按行存储的,以及是否使用了Fortran特有的数组下标从1开始的特性。 除了使用F2PY进行Python封装Fortran外,还可以使用Cython、SWIG等工具进行混合编程。这些工具都可以将Fortran代码编译成Python可调用模块,使得Python代码可以调用Fortran代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值