我需要使用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];
}
}发布于 2018-06-01 15:39:28
首先,不要自己拆分矩阵,而是让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。如果你想学习--我建议你从串行实现开始,然后继续并行化。无论是哪种情况,都有大量的教育材料可用。
https://stackoverflow.com/questions/50636060
复制相似问题