gpt4 book ai didi

performance - 更新到 Ubuntu 14.04 后重建的 Fortran 代码速度是原来的两倍

转载 作者:行者123 更新时间:2023-12-04 19:19:08 25 4
gpt4 key购买 nike

在将操作系统更新到 Ubuntu 14.04 并使用 Gfortran 4.8.2 重建后,我们的并行 Fortran 程序的运行速度要慢两倍多。不幸的是,测量代码的哪些部分变慢了(除非降级操作系统),因为我在旧操作系统下编译时没有为 gprof 保存任何分析信息。

因为该程序进行了大量的矩阵求逆,我的猜测是一个库(LAPACK?)或编程接口(interface)(OpenMP?)已经在 Ubuntu 12 和 14 之间以一种减慢一切的方式进行了更新。我相信这是一个普遍的问题,这里的人可能已经知道了。除了降级到 Ubuntu 12 或 13 之外,还有哪些解决方案可以恢复到快速的 Fortran 代码?

所有库都是使用 apg-get 从存储库安装的,因此,当我使用 apt-get dist-upgrade 升级系统时,它们也应该升级。 ,但是,我可以检查它们是否确实是最新版本和/或从头开始构建它们。

我遵循 Steabert 的建议并分析了当前代码:我用 gfortran -pg 重新编译并使用 gprof 检查性能.该程序在调用一些旧的 F77 子例程时速度慢得令人怀疑,我将其转换为 f90 并没有提高性能。我使用了建议的标志并比较了一个程序迭代的时间:标志-fno-aggressive-loop-optimizations , -llapack-lblas没有产生任何显着的性能改进。标志 -latlas , -llapack_latlas-lf77blas没有编译( /usr/bin/ld: cannot find -lf77blas 等),即使库存在并且在正确的路径中。编译器标志播放和性能分析都表明我的第一个猜测(减速与矩阵反转、LAPACK 等有关)是错误的。看起来速度变慢的部分代码没有执行繁重的线性代数。使用 objdump my_exec -s我发现我的程序在操作系统升级之前最初是用 gfortran 4.6.3 编译的。而不是使用当前的 gfortran (4.8.2)。我现在可以尝试使用旧编译器编译代码。

最佳答案

可能这不是 100% 令人满意的答案,但它解决了我的性能问题。所以这里是:

我决定使用 GDB(Valgrid 不适合我):我用标志 -g 编译,用“gdb myprogramname”执行,在 GDB 提示符下输入“run”来执行程序,用 ctr+C 暂停,检查什么线程正在使用“信息线程”并继续使用“继续”。我随机地做了几次,以在程序大部分时间花费的地方进行某种统计。这很快证实了 gprof 之前的发现,即我的程序在我翻译成 f90 的函数上投入了大量时间。但是,现在我还发现,在这个函数中花费特别长时间的数学运算是求幂,正如对 C 函数 e_powf.c 的调用所暗示的那样。我的函数(海水状态方程)有很多高阶多项式,其项如下 T**3 , T**4 .为了避免调用 e_powf.c 并查看这是否提高了代码的性能,我更改了 T**2 类型的所有术语至T*T ; T**3T*T*T等等。这是一个函数的摘录,它是以前的样子:

!          RW =     999.842594 + 6.793952E-2*T - 9.095290E-3*T**2+ 1.001685E-4*T**3 - 1.120083E-6*T**4 + 6.536332E-9*T**5

以及现在的情况:
 RW =     999.842594 + 6.793952E-2*T - 9.095290E-3*T*T+ 1.001685E-4*T*T*T - 1.120083E-6*T*T*T*T + 6.536332E-9*T*T*T*T*T

结果,我的程序再次以两倍的速度运行(即,就像我升级操作系统之前一样)。虽然这解决了我的性能问题,但我不能 100% 确定它是否真的与操作系统升级或从 4.6.3 到 4.8.2 的编译器更改有关。虽然目前的性能类似于预操作系统升级确实表明它应该是。

不幸的是,“locate e_powf”在我的系统中没有产生任何结果,似乎该函数是 gfortran 编译器的二进制部分,但没有给出源代码。通过谷歌搜索,似乎 e_powf.c 本身最近似乎没有更新(我猜,像 http://koala.cs.pub.ro/lxr/#glibc/sysdeps/ieee754/flt-32/e_powf.c 这样的互联网事件),所以如果从 Ubuntu 12 更改为 14 或从 gfortran 4.6.3 更改为 4.8 .2 这个函数的使用方式似乎有些微妙。

因为我在网上发现了一些关于是否使用 T*T 的讨论。而不是 T**2等应该会带来一些性能改进,并且大多数人似乎对此持怀疑态度(例如: http://computer-programming-forum.com/49-fortran/6b042075d8c77a4b.htm;或 stackoverflow 中的一个封闭问题: Tips and tricks on improving Fortran code performance)我仔细检查了我的发现,所以我可以说我非常确保使用变量的乘积(并避免像这样调用 e_powf.c)比求幂要快,至少在 gfortran 4.8.2 中是这样(无论是什么原因)。

非常感谢所有评论的人,当然它对我有很大帮助,我学到了很多!

关于performance - 更新到 Ubuntu 14.04 后重建的 Fortran 代码速度是原来的两倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26731856/

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