Openmp: иметь конструкцию MASTER внутри параллельного do - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть код Fortran, который выглядит следующим образом

!$OMP PARALLEL DO DEFAULT(PRIVATE) SHARED(var1, var2, var3, numberOfCalculationsPerformed)
do ix = 1,nx
  ! Do parallel work
  do iy = 1,ny
    ! Do a lot of work....
    !$OMP ATOMIC
    numberOfCalculationsPerformed = numberOfCalculationsPerformed+1
    !$OMP END ATOMIC
    !$OMP MASTER
    ! Report progress
    call progressCallBack(numberOfCalculationsPerformed/totalNCalculations)
    !$OMP END MASTER
  end do
end do

Когда я пытаюсь скомпилировать, он сообщает, что

ошибка # 7102: Директива OpenMP * MASTER не разрешенав динамической степени DO, ПАРАЛЛЕЛЬНО DO, СЕКЦИИ, ПАРАЛЛЕЛЬНЫХ СЕКЦИЙ или ОДНОЙ директивы.

Я не понимаю этого.Я попытался модифицировать конструкцию параллельного do для этого

!$OMP PARALLEL DO DEFAULT(PRIVATE) SHARED(var1, var2, var3, numberOfCalculationsPerformed), &
!$OMP& SCHEDULE(STATIC)

(полагая, что это как-то связано с расписанием), но это никак не изменило ошибку.Кто-нибудь знает, что я не получаю права?Просто невозможно использовать master внутри конструкции parallel do или как?Если это так, есть ли альтернативы?

Редактировать:

!$OMP SINGLE 
!$OMP END SINGLE

Вместо MASTER эквивалент дает тот же результат ... (сообщение об ошибке)

Ps.Мне нужен только один из потоков для выполнения progressCallback.

...