由于LAPACK的原因,使用OpenMP编程速度较慢

Program slower with OpenMP due to LAPACK

本文关键字:编程 OpenMP 速度 使用 LAPACK 由于      更新时间:2023-10-16

我有一个程序需要数百万次地查找 3x3 矩阵的特征值和特征向量。 为此,我刚刚改用 LAPACK 的 zheev(是的,它们是埃尔米特矩阵),对于特定情况,该程序在大约 1m20s 内运行。 我已经将我的算法与 OpenMP 并行化(就像我们之前所做的那样),突然我的程序在大约 9m 内运行。 我注释掉了对 zheev 的调用,我的程序在 9 秒内运行。

在网上环顾四周,发现(据我所知)您可以编译您的 BLAS 库以使用 OpenMP,但我认为这不是这里的问题。

不幸的是,这段代码来自我的工作,我没有在默认位置安装 lapack,我不知道编译时使用了哪些编译器选项。 这也使我很难编译一个最小的测试程序来演示这个问题。

关于问题可能是什么的任何想法?

编辑:

我刚刚发现 OpenMP zheev 失败了,这可能与它运行速度变慢有关。 我已经读到LAPACK中的某些例程不是线程安全的(或者它们有线程安全的变体),我如何知道zheev是否正在调用这些例程之一,我可以更改它吗?

暂时撇开 OpenMP 问题不谈,如果您的代码对性能敏感,您可能不希望使用 LAPACK 来查找 3x3 矩阵的特征值和特征向量;LAPACK针对的是"大"问题。 更重要的是,对于维数小于 5 的矩阵的特定情况,您可以直接计算特征值,因此您可以使用比一般矩阵更简单的算法(这必然需要迭代)。

回想一下,3x3 矩阵的特征多项式是三次多项式,这意味着您可以直接计算其根(即特征值)。 知道特征值后,您可以直接求解每个特征值 lambda 的 (A - lambda * I)x = 0,以获得相应的特征向量。