用于解决非常大的稀疏系统的快速 C++ 库

计算科学 线性求解器 稀疏矩阵 scipy 拉帕克
2021-12-04 21:19:23

我正在研究一个电路项目,我正在尝试计算电路所有节点的电压。我知道电路是一个完美的网格,所以每个节点最多只能接触 8 个其他节点。这意味着我最终试图解决一个系统: L v = i 其中L至少有一个 1000x1000 矩阵,其中每行只有 9 个非零。所以,它真的很稀疏。

我尝试使用SoPlexLaPACKSuperLU(最后两个通过Armadillo)解决它。但一切都太慢了。在 10000x10000 上,我最好的是 18 秒。

我知道还有另一种软件可以完成与我相同的任务,它是用 Python 编写的,它使用 Scipy(scipy.sparse.linalg准确地说)速度快得离谱(可以在不到一秒的时间内解决这些系统)。

是否有与 Scipy 等效的库或将 Scipy 移植到 C++ 的方法?由于其他原因,我需要用 C++ 编写软件...


编辑:我通过犰狳调用 SuperLU/LaPACK 的代码很简单: voltages[i] = spsolve(laplacians[i],iflow[i],"lapack"); 或者 voltages[i] = spsolve(laplacians[i],iflow[i],"superlu"); 之前没有给出任何选项。

4个回答

我赞同使用 Eigen 的想法,它非常有效,但包含起来也非常简单。如果您需要更多性能,可以尝试使用PETScTrilinos它们是存储和求解稀疏系统的非常强大的库,它们允许大量迭代或直接求解器,并且与 MPI 兼容以提高性能。但是,我认为即使在串行中它们也会非常高效。

大小为1k,规模不大。我认为可以使用许多稀疏直接求解器。首先,您需要确保您的矩阵是对称的(或不对称的)?,那么你可以选择合适的包来处理它们,比如PARDISO、MUMPS、UMFPACK、SuperLU等。如果您还想尝试带预处理的迭代求解器,可以尝试使用 ILUPACK、ARMS 等。

顺便问一下,你能和我们分享你的矩阵吗?最近,我们从实际应用中收集了一些测试矩阵来研究数值算法。我们计划建立一个测试矩阵数据库。

我会推荐SuiteSparsecuSPARSE

试试本征...基本建议,我知道。

Eigen 上次添加了几个稀疏求解器,并且还提供了具有已建立方法的基准,例如 UMFPACK 或 SUPERLU,在这些方法上它似乎表现得相当不错。