Зависимости задач OpenMP 4.5 и порядок выполнения - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь заставить работать задачи OpenMP безрезультатно.Давайте возьмем этот упрощенный пример:

int main()
{
int x=0;

#pragma omp parallel
#pragma omp single
{
#pragma omp task depend(in:x)
  {
  #pragma omp critical
  cout << "Read the value " << x << "\n";
  }
#pragma omp task depend(out:x)
  {
  x = 3;
  #pragma omp critical
  cout << "Set the value to " << x << "\n";
  }
}
return 0;
}

Насколько я понимаю (из спецификации OpenMP), зависимые (in: x) задачи должны выполняться только после того, как все зависимые (out: x) задачи были решеныи, следовательно, ожидаемый результат равен

Set the value to 3
Read the value 3

Однако вместо этого задачи выполняются в семантическом порядке, независимо от предложений зависимости, и я получаю следующее:

Read the value 0
Set the value to 3

ЯКомпиляция с использованием g ++ - 7 (SUSE Linux) 7.3.1 20180323 [gcc-7-branch revision 258812] с флагом -fopenmp.Эта версия компилятора должна иметь доступ к OpenMP 4.5.

Это неправильное понимание зависимостей задач с моей стороны, или здесь есть что-то еще?

1 Ответ

0 голосов
/ 25 мая 2018

Концепция зависимостей задач может вводить в заблуждение.

Лучший способ выразить это - подумать о них как о способе указать , как различные задачи обращаются к данным , а не как о способе управления порядком выполнения .

Порядок задач в исходном коде вместе с предложением зависимости описывают один из 4 возможных сценариев: чтение после записи , запись после чтения , запись после записи и чтение после чтения .

В вашем примере вы описываете запись запись после чтения : вы сообщаете компилятору, чтовторая задача перезапишет переменную x, но первая задача принимает x в качестве входных данных, как указано depend(in:x).Поэтому компилятор выполнит первую задачу перед вторым , чтобы предотвратить перезапись начального значения.

Если вы посмотрите на документацию Intel здесь , то есть краткий пример, который показывает, как порядок задач (в исходном коде) все еще играет роль в определении графа зависимостей (и, следовательно,, в порядке исполнения).

Еще одна информативная страница по этому вопросу доступна здесь .

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