откройте mp три для циклов с уменьшением - PullRequest
0 голосов
/ 01 июня 2018

Мне нужно умножить две матрицы 10x10, используя открытые mp.Я решил разбить ряды одной матрицы на группы по 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];
                    }
        }

1 Ответ

0 голосов
/ 01 июня 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...