c++ - 打开 mp 3 for 循环减少

标签 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];
                    }
        }

最佳答案

首先 - 不要自己拆分矩阵,而是让 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针对您的架构进行了优化。如果你想学习——我建议你从串行实现开始,然后继续并行化它。两者都有大量的教育 Material 。

关于c++ - 打开 mp 3 for 循环减少,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50636060/

相关文章:

c++ - 如何移动 Eigen 中的矩阵?

c++ - 如何使用 OpenMP 并行化此 Matrix times Vector 操作?

c++ - 我如何为 cc_library 添加默认的 copts,如 '-fopenmp'?

c++ - 增加线程数,但程序无法更快地运行 C++ OpenMP 选择排序

c++ - OpenMP 初学者 - 圈内问题

c++ - 动态库没有静态库文件的符号

c++ - 不同编译器中的纯/常量函数属性

c - 优化嵌套数组值的代码

c++ - while 循环是否比 for 循环更有效

c++ - CUDA 扭曲和每个 block 的最佳线程数