我知道有很多关于这个主题的信息,但我正在努力为我的特定问题找到最佳解决方案。
对于我的问题,A 非常大(~145k X 145k)和非常稀疏(每行最多 9 个非零值)。它不是正定的,也不是对称的,并且是复值(单精度)。稀疏模式可以通过想象一个三对角矩阵来可视化,然后在其上方和下方添加两个"三对角线",远离主三对角线。这给出了 3 组,每行 3 个非零,其中 3 组由 N 分隔(N 对于给定矩阵 A 是常数),并以主对角线为中心。由于边界条件,~5% 的行不会填充所有 9 个非零位置,因此这些行将具有主要非零模式的子集。
我需要求解多个右侧 (~1024)。我还需要解析 A 中具有不同数值但稀疏性模式相同的系统。 目前,我正在使用 SuperLU(单线程)将 A 分解为 LU,然后使用 cusparse(特别是 cusparseCcsrsm_solve)求解。
使用 LU 分解的稀疏直接求解器是解决我问题的最佳方法吗?哪个库对 LU 分解最快?用后换解决哪个是最快的?
就直接求解器中最快的而言,我更倾向于MUMPS
。作为主要参与者并积极开发的库(至少我知道和使用过的库)是MUMPS
、SuperLU
、UMFPACK
、SuiteSparse
、Trilinos
和PETSc
。
如果我要这样做,我会使用一个健壮的迭代求解器,并使用不完整的 LU 分解对其进行预条件。
迭代求解器的用户之间有一个众所周知的经验法则,如果您的系统大于 4x4,那么您需要使用迭代求解器。
如果你想使用迭代求解器,我建议使用 Trilinos
或 PETSc
.主要区别在于前者是面向对象的,而后者不是。它们之间的性能差异不大。
对于 GPU 编程,我没有足够的经验。我曾经使用过一个名为PARALUTION的库,这是一个不错的库。它为您隐藏了 GPU 实现。