【问题标题】:LAPACK: Inverting a Matrix without PivotingLAPACK:在不旋转的情况下反转矩阵
【发布时间】:2015-11-18 13:40:27
【问题描述】:

我一直在使用以下函数来反转 lapack 中的矩阵:

DGETRF()
DGETRI()

但是,子例程 DGETRF() 考虑部分旋转。

问题:在 lapack/blas 中是否有任何其他子程序可以替换 DGETRF() 而无需任何旋转。另外,我想知道是否有任何子程序使用高斯消元进行矩阵求逆而不是LU分解。

【问题讨论】:

  • 为什么固定例程使用的算法会有所不同?
  • 它因性能而异。透视算法很昂贵。通过编写矩阵求逆的高斯消元算法,我已经能够获得所提到子程序计算时间的近 50%。由于 BLAS 和 LAPACK 是由该主题的专家开发的,我们相信该软件包可能具有更快的算法,并且不会执行任何旋转。

标签: lapack blas matrix-inverse


【解决方案1】:

可以在here 找到 LAPACK 中可用的计算例程列表 - 滚动到页面底部,表 2.8。据我所知,一般矩阵的所有方法都使用分解来执行求逆。那么就没有使用GE计算逆的子程序了。

关于旋转,我怀疑除非你真的知道你在做什么,否则你可能不应该使用没有部分旋转的方法。部分旋转在性能方面并不是非常昂贵,但确实提供了改进的numerical stability。据我所知,高斯消除通常也与部分pivoting 一起使用。特别是如果主对角线上的任何元素为零(出于显而易见的原因),算法就会中断。此外,如果枢轴的值最大化,则解的数值精度通常会提高。

如果您在不调整 GE 版本的情况下获得改进的性能,这仅仅是因为您在牺牲方法的准确性/通用性来换取性能(恕我直言,当您真正知道自己是什么时,这是公平的游戏做并且有一个特定的用例,但我可以理解为什么库作者更喜欢使用更通用的实现)。

顺便说一句,如果你在性能比较游戏中,我会为了更好的衡量标准,与来自Intel's MKL 的矩阵求逆函数进行比较,并确保在绘制任何之前正确指定所有编译器优化标志(至少-O3 -march=native)结论。

【讨论】:

    【解决方案2】:

    您的代码是否操作 C 矩阵存储(按行)? LAPACK 和 BLAS 使用 Fortran 存储(按列)。 它可能会在缓存未命中方面产生重大影响。

    您的矩阵是否很大(适合缓存)?如果是这样,那么你需要转 在编译器级别进行非常积极的优化。尤其是当 它涉及轻松的浮点运算和 SIMD 矢量化。 如果您的矩阵很大,那么按照建议 paul-g 至少使用更快的 BLAS 和供应商 LAPACK(如果可用)。 参考 BLAS 不是 CPU 优化的,它只是 Fortran 代码。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多