OpenMP параллельная ошибка - PullRequest
1 голос
/ 31 марта 2020

В настоящее время я работаю над учебником по OpenMP, в котором был приведен следующий пример, и автор утверждает, что он содержит ошибку (результат неверный). Тем не менее, я не могу определить это:

#pragma omp parallel for private(temp)
for(i=0;i<N;i++)
{
  for (j=0;j<M;j++)
  {
    temp = b[i]*c[j];
    a[i][j] = temp * temp + d[i];
  }
}

Для меня нет ошибки, так как temp, i и j являются частными, а l oop over j выполняется последовательно. .. Я что-то упустил?

1 Ответ

1 голос
/ 31 марта 2020

Как упоминалось в предыдущих комментариях, переменные i и j не объявляются в операторах l oop. Поскольку компилятор позаботится о переменной l oop i, установив для нее значение private, но не j, внутренняя переменная l oop используется совместно, что приводит к фальсификации результата. Один из способов исправить это будет:

#pragma omp parallel for default (none) private(temp, i, j) shared(a, b, c, d)
for (i = 0; i < N; i++)
{
  for (j = 0; j < M; j++)
  {
    temp = b[i] * c[j];
    a[i][j] = temp * temp + d[i];
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...