我正在寻找一个高效的多核库来完成不完整的cholesky(可能已修改)。存在许多 ILU 代码,但除了 PETSC 或 Pastix 之外,我找不到太多关于 IC 的信息。你们中的一些人可以给我任何图书馆名称吗?
谢谢 !汤姆
我正在寻找一个高效的多核库来完成不完整的cholesky(可能已修改)。存在许多 ILU 代码,但除了 PETSC 或 Pastix 之外,我找不到太多关于 IC 的信息。你们中的一些人可以给我任何图书馆名称吗?
谢谢 !汤姆
首先,如果你有一个不完整的 LU 分解
,
你可以写上三角因子作为在哪里是对角线并且是单位直角三角形。如果矩阵是对称正定的,那么. 然后,您可以轻松地将不完整的 LU 分解修改为
,
或诚实的不完全 Cholesky 分解。您确实找到的矩阵应该在机器精度范围内相互转置。虽然这不能回答您寻找一个专门执行并行不完整 Cholesky 的库的问题,但只需稍作修改,它就会为您提供所需的内容。
Euclid 库在并行 ILU 中非常流行;PETSc 与其接口。然而,据我所知,它只适用于 ILU 而不是 IC,因此我在上面离题了。我打算建议您查看Hypre,但在查看他们的用户手册后,他们告诉您只使用 Euclid。
另一个想到的是pARMS(并行代数递归多级求解器)。pARMS 并不完全适用于纯 ILU 分解。它在与代数多重网格不同的多级框架中工作。( Yousef Saad 的书中有一个很好的解释,这也是并行 ILU 工作原理的一个很好的参考。)尽管如此,它是并行的,您可以将级别数设置为 0 以恢复通常的 ILU 分解。
最后,Trilinos有一个并行的 ILU 预处理器。然而,它只计算每个处理器本地的 ILU 分解,并使用一些重叠来保证该方法是可扩展的。据我所知,这并不是你要找的。
Trilinos 在 AztecOO 和 Ifpack 这两个包中提供了一个不完整的 Cholesky 预处理器。AztecOO 使用水平填充的概念提供基于模式的不完全分解。Ifpack 提供水平填充和基于阈值的跌落容差方法。
这些实现旨在作为子域求解器,作为加法 Schwarz 代数域分解预处理器的一部分,或作为代数多重网格预处理器的局部平滑器。它们可以在多核处理器上并行执行,但前提是您启用了 MPI。在这种情况下,每个 MPI 过程都被分配了一部分矩阵方程,在该部分上将使用不完整的 Cholesky 预处理器。如果您在禁用 MPI 支持的情况下编译 Trilinos,您仍然可以执行不完整的 Cholesky 预处理器,但只能在单个内核上执行。
每个细节都在这里:
http://trilinos.org/oldsite/packages/aztecoo/AztecOOUserGuide.pdf(从第 16 页开始)
http://trilinos.org/oldsite/packages/ifpack/IfpackUserGuide.pdf(从第 15 页开始)
使用 MPI 在多核处理器上获得并行性非常有效,但如果此时您正在运行顺序或基于 OpenMP 的代码,它通常需要对代码进行相当大的重构。
在典型的稀疏矩阵上从不完整的 Cholesky 获得良好的线程并行性能(例如,使用 OpenMP)具有挑战性。对于足够大的问题,分解阶段可以获得合理的加速,例如 8 核上的 5 倍(根据我自己的经验)。但是对于一般稀疏矩阵,求解阶段(您将在每次迭代中调用)很难大幅改善。无论使用多少核心,我很少看到超过 2 倍的改进。
完整的稀疏 Cholesky 算法具有丰富的图论框架,可以组织分解并解决多前(任务)和超节点(数据)并行性,并且可以从使用优化的密集 BLAS 中受益。此外,完全稀疏 Cholesky 的大部分计算时间都用于分解(同样更容易并行化),并且求解通常只调用一次(因为分解已完成)。因此,线程完整的 Cholesky 通常非常有效。
不完全 Cholesky 不具有这些相同的有利属性,这就是为什么线程并行性通常不会转化为不完全分解情况的原因。
如果您已经在使用 PETSc,我相当肯定它具有类似的功能。