LAPACK如何解决三对角线系统,为什么?


9

在我的项目中,我必须在每个时间步上求解几个三对角矩阵,因此拥有一个好的求解器至关重要。我做了自己的实现,只是Wikipedia上描述的经典方法。然后我尝试使用Lapack代替,令我惊讶的是它的速度更慢!

现在,在Lapack中,似乎通过LU分解进行求解,我不知道为什么,它不是比可能更复杂吗?

另外,我在nr.com的“数字食谱”书中找到了一种算法,该算法将系统递归地划分为较小的三对角线问题。看起来很有希望。那里还有其他东西吗?

更新:问题大小约为1000x1000。我使用了GotoBLAS,它也为您提供了Lapack 3.1.1库。问题不对称。我将Lapack例程用于一般的三对角矩阵。


2
您将必须说明为此使用了哪些LAPACK例程。请注意,dgtsv执行部分数据透视,但是您的代码可能不会执行此操作。还请说明您使用哪种LAPACK实施进行了测试,以及基准测试的问题规模。另外,您的问题对称正定吗?
杰德·布朗

我在问题表述中添加了一些信息。
tiam 2012年

您的应用程序与有限体积方法有关吗?
Inquest 2012年

这是有限的差异,但是从这个角度来看,我猜是差不多。
tiam 2012年

Answers:


6

您正在使用执行部分透视的参考实现。Tridiagonal解决方案只做很少的工作,因此不会调用BLAS。它可能比代码慢,因为它会进行部分透视。dgtsv源代码很简单。

如果将多次使用同一矩阵求解,则可能需要使用dgttrfdgttrs来存储因子。优化的LAPACK(例如MKL,ACML或ESSL)中的实现可能会更高效。


我有点好奇 带PP的高斯Elim适用于包括TriDiagonal在内的所有矩阵。在CFD中,对于FVM 1D情况,我们使用一种称为TDMA的特殊方法。对于他正在讨论的情况,您认为哪个会更快?虽然,我不确定他的矩阵在对角线占主导地位。
Inquest 2012年

TDMA是我在代码中实现的。问题是,为什么超快速Lapack会在这样一个特定的矩阵中使用部分枢转过程,而通过诸如TDMA这样的简单方法可以更快地解决该问题。
tiam 2012年

它是完全相同的算法(专用于三对角矩阵的高斯消去法),但是您的实现不会进行部分透视,因此在数值上可能不稳定。枢纽不是免费的,您正在与参考实现进行比较。该参考实现未针对性能进行优化,并且部分枢转不是免费的。
杰德·布朗

我明白了你的意思,我从我要解决的系统的知识中受益。LAPACK的其他实现是否会因适应特定体系结构而提高性能?
tiam 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.