Jacobi迭代的实现

计算科学 线性代数 表现
2021-11-27 17:46:15

我已经使用 CSR 格式的密集向量和稀疏矩阵在 C++ 中实现了 Jacobi 迭代。代码如下:

    {
        T omega = 2.0 / 3.0;
        std::vector<T> temp = result;

        for (int niter = 0; niter < maxit; ++niter)
        {
            for (int i = 0; i < matrix.get_rowptr()->size() - 1; ++i)
            {
                T rsum = 0.0;
                T diag = 0.0;

                for (int j = (*matrix.get_rowptr())[i]; j < (*matrix.get_rowptr())[i + 1]; ++j)
                {
                    if ((*matrix.get_columnindex())[j] == i)
                        diag = (*matrix.get_value())[j];
                    else
                        rsum += (*matrix.get_value())[j] * temp[(*matrix.get_columnindex())[j]];
                }

                if (diag != 0.0)
                    result[i] = temp[i] + omega * ((b[i] - rsum) / diag);
            }

            temp = result;
        }
    }

我已经分析了我的应用程序,这个函数是使用时间最多的函数。这是有道理的,因为这个函数被调用了几次。
现在我正在寻找一种更有效的方法来实现它,但找不到解决方案。顺便说一句,for 循环i使用 OpenMP 进行了并行化。我已经删除了这篇文章的这段代码。
知道如何加快速度吗?仅将此功能移至 CUDA 是否有意义?

1个回答

如果您真的想加快速度,我建议您将迭代更改为 SSOR 迭代。这可以比 jacobi 更快地收敛,并且如果您已经是 OpenMP 并行化,那么如果您的问题规模足够大,除了可能在 MPI 中进行域分解之外,您无能为力来提高性能。加快这一速度的最快和最简单的方法是通过 Gauss-Seidel 或 SSOR 迭代改进迭代,这两种方法都非常容易实现。