作为我博士学位的一部分。研究方面,我正在开发大气和海洋环流的数值模型。这些涉及在约 10^6 个网格点的数量级上以约 10^4 个时间步长对 PDE 系统进行数值求解。因此,在数十个 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
或者
b=a*a*a*a
我被教导在可能的情况下总是使用后者。这会影响效率和/或精度吗?(可能也依赖于编译器)
请讨论和/或添加您知道的有关提高 Fortran 代码效率的任何技巧和提示。还有什么?如果您知道上述每个编译器与此问题相关的具体内容,请也包括在内。
补充:请注意,我本身没有任何瓶颈或性能问题。我在问是否有任何一般规则来优化操作意义上的代码。
谢谢!