gpt4 book ai didi

performance - 提高 Fortran 代码性能的提示和技巧

转载 作者:行者123 更新时间:2023-12-04 04:55:42 24 4
gpt4 key购买 nike

就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the help center寻求指导。




10年前关闭。




作为我博士学位的一部分。研究方面,我正在开发大气和海洋环流的数值模型。这些涉及在约 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 代码效率的任何技巧和提示。还有什么?如果您知道上述每个编译器与此问题相关的具体内容,请也包括在内。

补充:请注意,我本身没有任何瓶颈或性能问题。我在问是否有任何一般规则来优化操作意义上的代码。

谢谢!

最佳答案

你对做什么有先验的想法,其中一些实际上可能会有所帮助,
但最大的返回是后验分析。
(补充:换句话说,将 a*b*c 放入不同的顺序可能会节省几个周期(我对此表示怀疑),同时您不知道您并没有被花费 1000 个周期没有充分的理由。)

无论您多么仔细地编码,都会有您没有预见到的加速机会。这是我找到它们的方法。 (有些人认为 this method 有争议)。

执行此操作时最好先关闭优化标志,这样代码就不会全部乱码。
稍后您可以打开它们并让编译器完成它的工作。

让它在具有足够工作负载的调试器下运行,以便运行一段合理的时间。
在它运行时,手动中断它,仔细看看它在做什么以及为什么。
这样做几次,比如 10 次,这样你就不会得出关于它花费时间的错误结论。

以下是您可能会发现的示例:

  • 由于某些表达式的编码方式或使用与先前调用相同的参数值,它可能会花费大量时间不必要地调用数学库函数。
  • 它可能会花费大量时间来执行一些文件 I/O,或者打开/关闭文件,深入一些看似无害的例程调用。
  • 它可以在通用库函数中,调用从属子例程,以检查上层函数的参数标志。在这种情况下,可以通过编写一个特殊用途的函数并调用它来消除大部分时间。

  • 如果您将整个操作执行两到三遍,您将删除在首次编写时进入任何软件的愚蠢内容。
    之后,您可以打开优化、并行性或其他任何东西,并确信没有时间花在愚蠢的事情上。

    关于performance - 提高 Fortran 代码性能的提示和技巧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7779701/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com