1

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

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

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

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

编辑:

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

4

1 回答 1

4

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

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

于 2012-04-13T14:52:00.027 回答