打开mp三个循环减少

时间:2018-06-01 04:21:39

标签: c++ openmp

我需要使用open mp乘以两个10x10矩阵。我决定将一个矩阵的行分成3组,3行和4行。我如何为前三行修复此代码?

#pragma omg parallel for reduction(+:m[p][q])
        {
            for (p = 0; p < 3; p++)
                for (q = 0; q < 10; q++)
                    for (k = 0; k < 10; ++k)
                    {
                        m[p][q] += l[p][k] * o[k][q];
                    }
        }

1 个答案:

答案 0 :(得分:2)

首先 - 不要自己拆分矩阵,但让OpenMP负责在循环中共享工作,例如

#pragma omg parallel for
{
    for (p = 0; p < 10; p++)
        for (q = 0; q < 10; q++)
            for (k = 0; k < 10; ++k)
            {
                m[p][q] += l[p][k] * o[k][q];
            }
}

在此代码中,不需要reduction,因为所有并发写操作都发生在m的不同元素上。即使你collapse(2)前两个循环,你在这方面仍然很好。

也就是说,优化矩阵乘法是现代硬件上一个非常复杂的主题。并行化更是如此。如果要获得性能,请使用针对您的体系结构进行了优化的BLAS implementation。如果你想学习 - 我建议你从串口实现开始,然后继续并行化。有很多教育材料可供选择。