HODLR icon indicating copy to clipboard operation
HODLR copied to clipboard

Parallelization of HODLR::solveNonSPD()

Open Charles-Chao-Chen opened this issue 3 years ago • 1 comments

Hi,

The function HODLR::solveNonSPD(Mat) has not been parallelized. The following is a straightforward parallelization, which may be useful for some users.

Mat HODLR::solveNonSPD(Mat b) {
Mat x = Mat::Zero(b.rows(),b.cols());

int r = b.cols();

// Solving over the leaf nodes:
#pragma omp parallel for
for(int k = 0; k < nodes_in_level[n_levels]; k++) 
{
    int start = tree[n_levels][k]->n_start;
    int size  = tree[n_levels][k]->n_size;

    x.block(start, 0, size, r) = this->solveLeafNonSPD(k, b.block(start, 0, size, r));
}

b = x;

// Solving over nonleaf levels:
for(int j = n_levels - 1; j >= 0; j--) 
{
    #pragma omp parallel for
    for (int k = 0; k < nodes_in_level[j]; k++) 
    {
        int start = tree[j][k]->n_start;
        int size  = tree[j][k]->n_size;
        
        x.block(start, 0, size, r) = this->solveNonLeafNonSPD(j, k, b.block(start, 0, size, r));
    }

    b = x;
}

return x;

}

Charles-Chao-Chen avatar Feb 18 '22 20:02 Charles-Chao-Chen

Thanks Chao 👍

sivaramambikasaran avatar Feb 19 '22 16:02 sivaramambikasaran