我需要使用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];
}
}
答案 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。如果你想学习 - 我建议你从串口实现开始,然后继续并行化。有很多教育材料可供选择。