вложено в lops в openmp - PullRequest
       6

вложено в lops в openmp

0 голосов
/ 21 октября 2018

Каков правильный распараллеливание ватт до 3-х вложенных для циклов с openmp?вот так:

#pragma omp parallel for
  for (i=0;i<SIZE;i++)
   for(j=0;j<SIZE;j++)
    for(k=0;k<SIZE;k++)
      mresult[i][j]=mresult[i][j] + matrixa[i][k]*matrixb[k][j];

или вот так

  #pragma omp parallel for
  for (i=0;i<SIZE;i++)
   #pragma omp parallel for
   for(j=0;j<SIZE;j++)
    #pragma omp parallel for
    for(k=0;k<SIZE;k++)
      mresult[i][j]=mresult[i][j] + matrixa[i][k]*matrixb[k][j];

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

Второй строго неверен, потому что есть условие гонки.Кроме того, вложение 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++)
0 голосов
/ 21 октября 2018

Ни один из них не приблизился бы к эффективности многопоточных реализаций netlib gemm.Без сомнения, это обсуждалось много раз более подробно.Если ваш случай достаточно велик, чтобы интересоваться параллелизмом, за исключением некоторой специализированной архитектуры, такой как nvidia, внешний цикл будет достаточно большим, чтобы каждый поток был занят почти на равных участках непрерывной памяти, и вы не захотите препятствовать применению компиляторомоптимизация одного потока на внутренних циклах.

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