Для начала - не разбивайте матрицу самостоятельно, но позвольте 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 , оптимизированную для вашей архитектуры.Если вы хотите учиться - я предлагаю вам начать с последовательной реализации, а затем продолжать распараллеливать ее.Есть много учебных материалов для любого.