作为我博士学位的一部分。研究方面,我正在研究大气和海洋环流数值模型的开发。这些涉及到约 10^6 个网格点、超过约 10^4 个时间步长的偏微分方程数值求解系统。因此,当在数十个 CPU 上的 MPI 中运行时,典型的模型仿真需要数小时到几天才能完成。当然,尽可能提高模型效率很重要,同时确保结果逐字节相同。
虽然我对 Fortran 编程感到非常满意,并且知道很多使代码更高效的技巧,但我觉得仍然有改进的空间,以及我不知道的技巧。
目前,我确保使用尽可能少的除法,并尽量不使用文字常量(我很早就被教导要这样做,例如在实际计算中使用 half=0.5 而不是 0.5),使用尽可能少的超越函数尽可能等
还有哪些其他性能敏感因素?目前,我想知道几个:
1)数学运算的顺序重要吗?例如,如果我有:
a=1E-7 ; b=2E4 ; c=3E13
d=a*b*c
d 会根据乘法顺序以不同的效率进行计算吗?如今,这必须是特定于编译器的,但是有直接的答案吗?我注意到 d 根据顺序(精度限制)获得(略有)不同的值,但这会影响效率吗?
2)将大量(例如数十个)数组作为参数传递给子例程与从子例程内的模块访问这些数组?
3) Fortran 95 结构(FORALL 和 WHERE)与 DO 和 IF 比较?我知道这些在 90 年代很重要,当时代码矢量化是一件大事,但是现在现代编译器能够矢量化显式 DO 循环有什么区别吗? (我在工作中使用 PGI、Intel 和 IBM 编译器)
4) 数字的整数次方与乘法?例如。:
b=a**4
or
b=a*a*a*a
我被教导要尽可能使用后者。这会影响效率和/或精度吗? (可能也依赖于编译器)
请讨论和/或添加您所知道的有关提高 Fortran 代码效率的任何技巧和技巧。外面还有什么?如果您知道上述每个编译器与此问题相关的具体操作,请也将其包括在内。
补充:请注意,我本身没有任何瓶颈或性能问题。我想问是否有任何在操作意义上优化代码的通用规则。
谢谢!