提高 Fortran 代码性能的提示和技巧 [关闭]

2024-01-07

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

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

谢谢!


抱歉,但你提到的所有技巧都是……荒谬的。更准确地说,它们在实践中没有任何意义。例如:

  • 使用 half(=0.5) 而不是 0.5 有什么好处?
  • 同上计算a**4 or a*a*a*a. (a*a)** 2也将是另一种可能性。我个人的品味是**4,因为一个好的编译器会自动选择最佳方式。

For **,唯一重要的一点是之间的区别a ** 4 and a ** 4.,后者消耗更多的CPU时间。但如果没有在实际模拟中进行测量,即使这一点也没有任何意义。

事实上,你的做法是错误的。尽可能地开发您的代码。之后,客观地衡量代码不同部分的成本。事先不进行测量就进行优化是毫无意义的。

如果某个部分的 CPU 占用率很高,例如 50%,请不要忘记,仅优化该部分无法将整个代码的成本除以大于两倍的系数。无论如何,从最昂贵的部分(瓶颈)开始优化工作。

还不要忘记,主要的改进通常来自更好的算法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

提高 Fortran 代码性能的提示和技巧 [关闭] 的相关文章

  • 指定 gfortran 应该在其中查找模块的目录

    我目前基于模块来编译程序 例如主程序foo这取决于模块bar 如下 gfortran c bar f90 gfortran o foo exe foo f90 bar o 当foo f90 and bar f90位于同一目录中 如何指定 g
  • gcc 不太可能使用宏

    我正在编写一段关键代码 其逻辑大致如下 if expression is true do something with extremely low latency before the nuke blows up This branch i
  • 快速 log2(float x) 实现 C++

    我需要在 C 中非常快速地实现 log2 float x 函数 我发现了一个非常有趣的实现 而且速度非常快 include
  • 为什么 std::atomic 比 volatile bool 慢很多?

    多年来我一直使用 volatile bool 来控制线程执行 并且效果很好 in my class declaration volatile bool stop In the thread function while stop do th
  • 为什么 cross_val_predict 比 KNeighborsClassifier 的拟合慢得多?

    在 Jupyter 笔记本上本地运行并使用 MNIST 数据集 28k 条目 每个图像 28x28 像素 以下内容为27秒 from sklearn neighbors import KNeighborsClassifier knn clf
  • 未使用的功能会产生什么后果

    我想知道在代码中使用未使用的函数会产生什么 如果有什么后果 如果您查找并删除所有未使用的函数和变量 性能是否会有明显的改进 或者删除未使用的函数和变量只是一个好习惯 未使用的功能不会损害性能 他们让维护代码的人的工作变得更加困难 现代 ID
  • 在一条语句中对多个变量进行相同的赋值

    有没有一种方法可以为不同的变量分配相同的值 而无需在单个语句中构造数组 例如 如果我有变量a b c d and e 我可以分配类似的东西吗 a b c d e 10 0 我知道我可以用一行来做 a 10 0 b 10 0 c 10 0 d
  • 双端队列与队列速度

    我正在研究 LeetCode 上的一个问题 Here https leetcode com problems moving average from data stream 当我完成这个问题后 我想出了 class MovingAverag
  • C# 的快速线程安全随机数生成器

    我需要在多个正在运行的线程中快速生成随机浮点数 我尝试过使用System Random 但它对于我的需求来说太慢了 并且它在多个线程中返回相同的数字 当我在单线程中运行应用程序时 它工作正常 此外 我需要确保生成的数字在 0 到 100 之
  • 用 C 更快地读取文件

    嗯 我想知道是否有一种比使用 fscanf 更快地读取文件的方法 例如假设我有这个文本 4 55 k 52 o 24 l 523 i 首先 我想读取第一个数字 它给出了接下来的行数 令这个数称为N N 之后 我想读取 N 行 其中有一个整数
  • HTML5 Canvas 性能:加载图像与绘图

    我正计划使用 javascript canvas 编写一个游戏 我只有一个问题 在加载图像与仅使用 canvas 的方法进行绘图方面 我应该考虑什么样的性能考虑因素 因为我的游戏将使用非常简单的几何图形 圆形 正方形 直线 所以任何一种方法
  • 增量SQL查询

    我的应用程序有一组固定的 SQL 查询 这些查询以轮询模式运行 每 10 秒一次 由于数据库的大小 gt 100 GB 和设计 超级规范化 我遇到了性能问题 每当数据库上发生更改查询结果的 CRUD 事件时 是否可以对给定查询进行增量更改
  • 性能计数器的性能影响是什么

    当考虑使用性能计数器作为我公司的基于 NET 的站点时 我想知道使用它们的开销有多大 我是否想让我的网站不断更新其计数器 或者我最好只在测量时更新 设置性能计数器的开销通常不够高 无需担心 设置共享内存区域和一些 NET 对象 以及 CLR
  • setInterval() 如何影响性能?

    我们正在使用 Twitter Bootstrap 作为框架构建一个 Web 应用程序 但在显示 隐藏工具提示时遇到问题 除了尝试找到实际问题的解决方案之外 我还有一个关于我们同时使用的解决方法的问题 从性能角度来看 使用 setInterv
  • Emacs 行编号性能

    我试过了linum and nlinum 两者对于超过 100k 行的文件的性能都很糟糕 for x in 1 100000 do echo x done gt 100k txt emacs q 100k txt M x load libr
  • 有效地生成所有排列

    我需要尽快生成所有排列 https en wikipedia org wiki Permutation整数的0 1 2 n 1并得到结果作为NumPy https numpy org 形状数组 factorial n n 或者迭代此类数组的
  • 优化 CSS 交付 - Google 的建议

    谷歌建议在 head 中使用非常重要的 CSS 内联 并在内部使用其他 CSS
  • 为什么 Java 11 中对于空白字符串 String.strip() 比 String.trim() 快 5 倍

    我遇到过一个有趣的场景 因为某些原因strip 针对空白字符串 仅包含空格 明显快于trim 在Java 11中 基准 public class Test public static final String TEST STRING 3 w
  • 在 C/C++ 中获得正模数的最快方法

    通常在我的内部循环中 我需要以 环绕 方式索引数组 因此 例如 如果数组大小为 100 并且我的代码要求元素 2 则应该给它元素 98 高级语言 例如 Python 可以简单地使用my array index array size 但由于某
  • Python——捕获异常的效率[重复]

    这个问题在这里已经有答案了 可能的重复 Python 常见问题解答 异常有多快 https stackoverflow com questions 8107695 python faq how fast are exceptions 我记得

随机推荐