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

时间:2012-04-13 14:33:47

标签: c++ openmp lapack

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

我在网上浏览过,发现(据我所知)你可以编译你的BLAS库来使用OpenMP,但我不认为这是问题。

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

关于问题的任何想法?

修改

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

1 个答案:

答案 0 :(得分:4)

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

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