由于LAPACK的原因,使用OpenMP编程速度较慢
Program slower with OpenMP due to LAPACK
我有一个程序需要数百万次地查找 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,以获得相应的特征向量。
相关文章:
- OpenMP阵列性能较差
- 有一个打印语句的函数是一种糟糕的编程实践吗
- OpenMP卸载说'fatal error: could not find accel/nvptx-none/mkoffload'
- 使用 GCC 卸载的 OpenMP 卸载失败,并出现"Ptx assembly aborted due to errors"
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- OpenMP:并行更新数组总是需要减少数组吗
- 模板元编程:如何将参数包组合成新的参数包
- Qt Q串行端口未编程设备未关闭
- 如何使用OpenMP并行这两个循环
- 从python调用openMP共享库时,未定义opnMP函数
- 如何使用OpenMP并行化此矩阵时间矢量运算
- 如何使用OpenMP使这个循环并行
- 如何通过替换顺序代码的while循环来添加OpenMP for循环
- 查找最近配对时的OpenMP竞赛条件
- 所有的openMp c++编程都是使用在GPU上运行的-fopenmp编译的吗
- OpenMP 并行编程基于线程数与执行时间的关系
- 如何将GDB与OpenMP和并行编程使用
- C++中用于嵌套循环的OpenMP编程的锁定策略
- 用openMP进行并行编程
- 由于LAPACK的原因,使用OpenMP编程速度较慢