哪个 C++ 线性代数库在解决巨大的稀疏 [方阵] 线性系统方面可能是最快的?

计算科学 线性代数 线性求解器 稀疏矩阵 共轭梯度
2021-12-13 13:58:21

我正在开发用于流体-粒子相互作用的 2D CFD 求解器。在大小网格上求解 Navier-Stokes 方程10000×10000细胞(或 > 100 万个细胞),一个大型线性系统Ax=bA作为10000×10000稀疏系数矩阵需要在每个时间步有效地求解。

我正在寻找的是一个高性能/并行 C++ 线性代数库来解决这个大型稀疏线性系统。优选迭代方法,例如双共轭梯度稳定方法。

有很多现有的库,例如:Eigen3、PETSc、Trilinos、MLT4、GNU GSL、Armadillo、LAPACK++,不胜枚举。

在著名的库中,我应该为我的项目选择哪一个,就高性能(OpenMP/MPI 支持更好)和在 c++ 中易于使用而言。

1个回答

Eigen 3 是一个不错的 C++ 模板库,其中一些例程是并行的。 cf Eigen 文档 并行化仅适用于 OMP,因此如果您打算使用 MPI(和 OMP)进行并行化,它可能不适合您的目的。#define EIGEN_USE_BLASEigen 的一个很好的特性是,您可以通过简单地使用(和其他宏)为某些例程交换高性能 BLAS 库(如 MKL 或 OpenBLAS )。

同样,犰狳只允许节点级并行。根据我的经验,最好使用 Eigen,因为它更容易与 Eigen 中的原始 C++ 数组交互,这有助于使用其他库(例如 ARPACK++)。

根据我的经验,我建议不要将 GSL 用于线性代数。我发现它的性能不足,可用性比 Eigen 差。

如果您计划在多个节点上执行线性求解器(例如 BiCGstab),我建议您使用 Trilinos。由于 Trilinos 主页上提供了很好的示例,我在我的研究代码中使用了它,几乎没有深入研究它的文档。此外,它的性能还不错,并且可以通过在编译期间包含好的 BLAS/LAPACK 库来进行微调。

PETSc 也应该有类似的情况,尽管我从未积极使用过它的 LA 套路。以我的经验,PETSc 是依赖地狱,如果您想使用性能优化(例如针对您正在使用的 CPU 架构优化)版本的库,它需要。我认为,性能也应该相当不错,因为 PETSc 依赖于常见的 LA 库(BLAS、LAPACK、SCALAPACK 等)。

长话短说:为了在单个节点上实现互操作性和良好性能(使用 OpenMP),我建议将Eigen 与 OpenBLAS一起使用。如果您想通过 MPI 使用多个节点并让库弄清楚如何使用多个节点解决系统问题,请使用Trilinos