Поэтому я пишу немного параллельного кода на Фортране, но мне нужно использовать критический блок, чтобы предотвратить состояние гонки. Вот голая версия моего кода (это оптимизатор):
do i=2,8,2
do j=1,9-i
Ftemp=1.0e20 !A large number
!$OMP parallel do default(shared) private(...variables...)
do k=1,N
###Some code that calculates variable Fobj###
!$OMP Critical
!$OMP Flush(Ftemp,S,Fv) !Variables I want optimized
if (Fobj.lt.Ftemp) then
S=Stemp
Fv=Ft
Ftemp=Fobj
end if
!OMP Flush(Ftemp,S,Fv)
!OMP end Critical
end do !Line 122
!$OMP end parallel do !Line 123
end do
end do
Так что без openmp код работает нормально. Он также работает без критических команд (команды Flush в порядке). Ошибка, которую я получаю, это «неожиданный оператор END» в строке 122 и «неожиданный оператор !$OMP end parallel do» в строке 123. Я понятия не имею, почему это не сработает, поскольку критический блок полностью содержится внутри параллельного цикла и нет операторов выхода/перехода, которые либо покидают, либо входят... некоторые переходы перескакивают через основную часть цикла, но никогда не покидают его и не входят/обходят критический блок.
flush
, еслиcritical
подразумевает полныйflush
при входе и выходе из региона? Я сомневаюсь, что это имеет какое-либо отношение к вашей проблеме, однако хотя бы для ясности кода следует удалить 2 директивыflush
. - person Gilles   schedule 08.12.2015!OMP end Critical
отсутствует$
сразу после!
. - person Hristo Iliev   schedule 09.12.2015