特征和并行化对共轭梯度没有影响。先决条件也失败

时间:2017-02-09 10:26:50

标签: multithreading sparse-matrix eigen eigen3

这与此question有关。我今天对共轭渐变进行了一些实验,特别是我尝试了max_iterationstolerance。它更快但不够快。根据文档,在编译中添加-fopenmp以启用multi-threading就足够了。

我已使用两者进行了测试

`omp_set_num_threads(nbrThreads);
 Eigen::setNbThreads(nbrThreads);`

如果我使用5个线程或1个线程,时间没有区别,我觉得有点奇怪。

其次,使用pre-conditoning加速解决方案的另一种方法。当我尝试做的时候:

    Eigen::ConjugateGradient<Eigen::SparseMatrix<float>, Eigen::Lower, Eigen::IncompleteCholesky<float>> cg;

我收到错误:

    void Eigen::IncompleteCholesky<Scalar, _UpLo, _OrderingType>::_solve_impl(const Rhs&, Dest&) const [with Rhs = Eigen::Matr
ix<float, -1, 1>; Dest = Eigen::Matrix<float, -1, 1>; Scalar = float; int _UpLo = 1; _OrderingType = Eigen::AMDOrdering<int>]: Assertion `m_factorizationIsOk && "factorize() should be called first"' failed.

鉴于Eigen::SimplicialLDLT的作用是Cholesky分解,那么不完整也应该有用吗?

编辑: 以下是我如何调用cg:

Eigen::ConjugateGradient<Eigen::SparseMatrix<float>, Eigen::Lower, Eigen::IncompleteCholesky<float>> cg;
cg.setTolerance(0.01);
cg.setMaxIterations(50);
cg.analyzePattern(A_tot);
cg.compute(A_tot);
Eigen::VectorXf opt = cg.solveWithGuess(b_tot, rho_current);

实际上当您阅读有关IterativeSolvers here的内容时,则未列出IncompleteCholesky。虽然IncompleCholesky被定义为here

2 个答案:

答案 0 :(得分:1)

如文档中所述,您需要存储完整矩阵(上下三角形部分),并将Lower|Upper传递给ConjugateGradient以使用cg进行多线程处理。

答案 1 :(得分:0)

问题似乎是我安装了一个beta版本的Eigen。它使用Eigen 3.3.2

与预调节器一起运行