OpenMP с использованием конструкции Critical приводит к сбою моего кода

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

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. Я понятия не имею, почему это не сработает, поскольку критический блок полностью содержится внутри параллельного цикла и нет операторов выхода/перехода, которые либо покидают, либо входят... некоторые переходы перескакивают через основную часть цикла, но никогда не покидают его и не входят/обходят критический блок.


person Mark Kavanagh    schedule 08.12.2015    source источник
comment
Какой смысл в 2 директивах flush, если critical подразумевает полный flush при входе и выходе из региона? Я сомневаюсь, что это имеет какое-либо отношение к вашей проблеме, однако хотя бы для ясности кода следует удалить 2 директивы flush.   -  person Gilles    schedule 08.12.2015
comment
Какой компилятор вы используете? Вы уверены, что точно скопировали код?   -  person Vladimir F    schedule 09.12.2015
comment
В вашей закрывающей директиве !OMP end Critical отсутствует $ сразу после !.   -  person Hristo Iliev    schedule 09.12.2015
comment
Как ясно видно из комментария @HristoIliev, это, похоже, результат простой опечатки. Голосование за закрытие.   -  person High Performance Mark    schedule 10.12.2015


Ответы (1)


Как отмечает Христо Илиев в комментарии: В вашей заключительной директиве !OMP end Critical отсутствует $ сразу после !.

Он рассматривается как комментарий и игнорируется.

person Community    schedule 10.12.2015