我需要使用 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/