Как я могу добиться сокращения с помощью задач OpenMP? - PullRequest
0 голосов
/ 24 ноября 2018

У меня есть этот код OpenMP, который выполняет простое сокращение:

for(k = 0; k < m; k++) 
{
      #pragma omp parallel for private(i) reduction(+:mysum) schedule(static) 
      for (i = 0; i < m; i++)
      {
           mysum += a[i][k] * a[i][k];
      }
}

Я хочу создать код, эквивалентный этому, но с использованием задач OpenMP.Вот что я пробовал, следуя этой статье:

for(k = 0; k < m; k++) 
{
    #pragma omp parallel reduction(+:mysum)
    {
         #pragma omp single 
         {
                  for (i = 0; i < m; i++) 
                  {
                        #pragma omp task private(i) shared(k)
                        {
                                partialSum += a[i][k] * a[i][k];
                        }
                   }
         }

         #pragma omp taskwait
         mysum += partialSum;
     }
 }

Переменная partialSum объявлена ​​как threadprivate, и это также глобальная переменная:

int partialSum = 0;
#pragma omp threadprivate(partialSum)

a - это простой массив целых чисел (mxm).

Проблема в том, что когда я запускаю приведенный выше код (тот, что с задачами) несколько раз, я получаю разные результаты.

У вас есть представление о том, что я должен изменить, чтобы сделать эту работу?

С уважением

1 Ответ

0 голосов
/ 26 ноября 2018

private переменные неинициализированы (по крайней мере, не инициализированы их внешним значением).i должно быть firstprivate.

Если вы просто избавитесь от private(i) shared(k), то по умолчанию все правильно.k происходит из-за пределов раздела parallel и, следовательно, неявно shared в разделе parallel.Это также делает его неявно shared в конструкции, генерирующей задачу.Прямо сейчас i также является общим / общим.Если вы определяете его локально (for (int i...), оно становится неявно private в секции parallel и, следовательно, неявно firstprivate в конструкции, генерирующей задачу.

Вы также должны добавить

#pragma omp atomic
mysum += partialSum;

С другой стороны, вам не обязательно нужен taskwait (см. этот ответ )

Обратите внимание, что в разговоре правильно используется firstprivate.

...