【发布时间】:2014-11-04 09:38:54
【问题描述】:
在将操作系统更新到 Ubuntu 14.04 并使用 Gfortran 4.8.2 重新构建后,我们的并行 Fortran 程序的运行速度要慢两倍多。不幸的是,不再可能测量代码的哪些部分变慢了(除非降级操作系统),因为在旧操作系统下编译时我没有为 gprof 保存任何分析信息。
因为该程序进行了大量的矩阵求逆,我猜想一个库(LAPACK?)或编程接口(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)。我现在可以尝试用旧的编译器编译代码。
【问题讨论】:
-
如果没有代码,这将很难回答。您是否测量过瓶颈在哪里以及代码的哪些部分变慢了?如果没有,请立即执行。
-
当然,没有什么能阻止您构建自己的 LAPACK 和 BLAS。确保使用一些优化的 BLAS 库,例如 ATLAS 或 OpenBLAS。它们甚至可能存在于您的存储库中。
-
关于您的编辑:您使用哪些库?最重要的是,您使用哪种 BLAS 实现?在你的包管理器中搜索“BLAS”,会有更多。
-
另外,即使你无法确定是什么变慢了,你仍然可以确定在新编译的代码中什么最耗时。
-
我会先询问您是否使用 MPI,并且处理器数量错误。而且,正如@steabert 所说,您仍然可以确定什么时间最长。如果您使用的是 gprof,它可能不会告诉您太多信息。 This explains the method I use. 在像 BLAS 和 LAPACK 这样的包中,对大矩阵的少量操作可能很快,但对小矩阵的大量操作可能会将大部分时间花在可避免的杂项上,例如检查参数。
标签: performance ubuntu fortran exponentiation