【发布时间】:2021-08-29 00:26:05
【问题描述】:
我有一个 c++ 代码(用 g++ 编译),它创建并填充了一个 blitz++ 矩阵,其中填充了复杂的双精度值(我称之为 lseMatrix)。然后使用 zgetrf fortran 例程将矩阵反转为
zgetrf_(&n, &n, &((*lseMatrix)(0, 0)), &n, &(iPiv(0)), &info)
我的旧机器(在 Ubuntu 16.04 下,单处理器)安装了 g++ 和 gfortran(版本 5.4)和 lapack/blas(v. 3.6.0-2ubuntu2)。代码在那里运行得非常好,用 zgetrf 反转相对较大的矩阵大约需要 10 分钟。但是,当我用我的新机器(在 Ubuntu 20.04 下,两个配对处理器)运行代码时,具有最新版本的 g++ 和 gfotran(v. 9.3)和最新的 lapack/blas(3.9.0-1build1),反转操作需要 5 小时。
已经进行了以下测试:
-
在没有编译优化标志的新旧机器上运行代码。结果:性能没有变化。
-
尝试在旧机器上的链接阶段创建带有 -static 标志的静态库,并在新机器上运行生成的 .exe 文件。这部分解决了问题。两台机器上的性能速度是一样的,但是程序有时候会出乎意料的crash。
非常感谢您提供有关可能解决方案的建议。
【问题讨论】:
-
欢迎,我建议使用tour 并阅读How to Ask。向我们展示一个可以编译、运行并查看它是快还是小的小型测试程序会非常有帮助。无论如何,您可能应该自己测试更大范围的矩阵大小的子例程的性能。另见minimal reproducible example。请注意,要获得最佳性能,您应该使用一些高性能的 BLAS 实现,例如 OpenBLAS、GotoBLAS、ATLAS 或 MKL。您的旧机器是否有 BLAS 线程?
标签: performance compiler-errors g++ gfortran blitz++