У меня есть код 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
.