繁体   English   中英

如何将 OpenMp 添加到三重嵌套 for 循环

[英]How to add OpenMp to triple nested for-loop

目标是将尽可能多的 OpenMP 添加到以下 Cholesky 因子 function 以增加并行化。 到目前为止,我只有一个#pragma omp parallel for正确实现。 vector<vector<double>>表示一个二维矩阵。 我已经尝试为 for 添加#pragma omp parallel for for
for (int i = 0; i < n; ++i)for (int k = 0; k < i; ++k)for (int j = 0; j < k; ++j)但是并行化出错。 makeMatrix(n, n)初始化大小为nxn的全零vector<vector<double>>

vector<vector<double>> cholesky_factor(vector<vector<double>> input)
{
    int n = input.size();
    vector<vector<double>> result = makeMatrix(n, n);
        
    for (int i = 0; i < n; ++i) 
    {
        for (int k = 0; k < i; ++k)
        {
            double value = input[i][k];
            for (int j = 0; j < k; ++j)
            {
                value -= result[i][j] * result[k][j];
            }
            result[i][k] = value / result[k][k];
        }
        double value = input[i][i];
        #pragma omp parallel for
        for (int j = 0; j < i; ++j)
        {
            value -= result[i][j] * result[i][j];
        }
        result[i][i] = std::sqrt(value);
    }

    return result;
}

我不认为你可以用这个算法进行更多的并行化,因为外部循环的第i次迭代取决于i - 1次迭代的结果,而内部循环的第k次迭代取决于结果k - 1次迭代。

vector<vector<double>> cholesky_factor(vector<vector<double>> input)
{
    int n = input.size();
    vector<vector<double>> result = makeMatrix(n, n);
        
    for (int i = 0; i < n; ++i) 
    {
        for (int k = 0; k < i; ++k)
        {
            double value = input[i][k];
            // reduction(-: value) does the same 
            // (private instances of value are initialized to zero and
            // added to the initial instance of value when the threads are joining
            #pragma omp parallel for reduction(+: value)
            for (int j = 0; j < k; ++j)
            {
                value -= result[i][j] * result[k][j];
            }
            result[i][k] = value / result[k][k];
        }
        double value = input[i][i];
        #pragma omp parallel for reduction(+: value)
        for (int j = 0; j < i; ++j)
        {
            value -= result[i][j] * result[i][j];
        }
        result[i][i] = std::sqrt(value);
    }

    return result;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM