所以我在Fortran中编写了一些并行代码,但是我需要使用关键块来防止竞争条件。这是我的代码的一个简单版本(它是一个优化器):
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命令很好)。我得到的错误是第122行的“意外的END语句”和第123行的“Unexpected!$ OMP end parallel do statement”。我不知道为什么这不起作用,因为关键块完全包含在并行循环中没有退出/ goto语句将离开或输入...一些gotos跳转到循环的主要部分,但从不离开它或进入/绕过关键块。
答案 0 :(得分:1)
Hristo Iliev在评论中指出:你的结束指示!OMP end Critical
在$
之后错过!
。
它被视为评论并被忽略。