Mark Kavanagh
Mark Kavanagh

Reputation: 7

OpenMP using Critical construct crashes my code

So am writing a bit of parallel code in Fortran, but I need to use the critical block to prevent a race condition. Here's a bare-bones version of my code (it's an optimizer):

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

So without openmp, the code works fine. It also runs without the critical commands (Flush commands are fine). The error I get is "unexpected END statement" on Line 122 and "Unexpected !$OMP end parallel do statement" on line 123. I have no idea why this won't work as the critical block is fully contained inside the parallel loop and there are no exit/goto statements that will leave or enter either... some gotos jump around the main part of the loop, but never leaving it or entering/bypassing the critical block.

Upvotes: 1

Views: 319

Answers (1)

As Hristo Iliev points out in the comment: Your closing directive !OMP end Critical is missing a $ right after the !.

It is treated just as a comment and ignored.

Upvotes: 1

Related Questions