Второй строго неверен, потому что есть условие гонки.Кроме того, вложение parallel
, как правило, является плохой идеей, поскольку обычно оно порождает больше потоков, чем ядер, что приводит к плохой производительности.
Первая строка вполне подходит, если SIZE
достаточно велик, чтобы предоставить достаточно параллельной работы.Как правило, распараллеливание самого внешнего цикла лучше всего из-за дополнительной работы для тех же издержек распараллеливания.Если внешнему циклу не хватает параллелизма, можно подумать о добавлении collapse(2)
, что является правильным способом распараллеливания циклов, хотя в этом случае и не требуется.
Все это говорит, если вы хотите матрицу производительностиумножение, используйте библиотеку, как указано Tim18.Получение оптимальной эффективности с помощью умножения матриц чрезвычайно сложно и выходит за рамки этого ответа.
Как указывает Z-Boson, ваша первая версия также неверна, поскольку переменные внутреннего цикла по умолчанию используются совместно.Вы можете пометить их private(j,k)
или, что еще лучше, просто определив их в цикле, который в любом случае намного понятнее:
#pragma omp parallel for
for (int i=0;i<SIZE;i++)
for (int j=0;j<SIZE;j++)
for (int k=0;k<SIZE;k++)