Parallel processing 使用关键构造的OpenMP使我的代码崩溃
因此,我用Fortran编写了一些并行代码,但我需要使用关键块来防止竞争情况。下面是我的代码的基本版本(它是一个优化器):Parallel processing 使用关键构造的OpenMP使我的代码崩溃,parallel-processing,fortran,openmp,critical-section,Parallel Processing,Fortran,Openmp,Critical Section,因此,我用Fortran编写了一些并行代码,但我需要使用关键块来防止竞争情况。下面是我的代码的基本版本(它是一个优化器): 因此,如果没有openmp,代码工作正常。它也可以在没有关键命令的情况下运行(Flush命令也可以)。我得到的错误是第122行的“意外结束语句”和第123行的“意外!$OMP END parallel do语句”。我不知道为什么这不起作用,因为关键块完全包含在并行循环中,并且没有退出或进入的exit/goto语句。。。一些Goto在循环的主要部分跳跃,但从不离开循环或进入/
因此,如果没有openmp,代码工作正常。它也可以在没有关键命令的情况下运行(Flush命令也可以)。我得到的错误是第122行的“意外结束语句”和第123行的“意外!$OMP END parallel do语句”。我不知道为什么这不起作用,因为关键块完全包含在并行循环中,并且没有退出或进入的exit/goto语句。。。一些Goto在循环的主要部分跳跃,但从不离开循环或进入/绕过关键块。正如赫里斯托·伊利耶夫在评论中指出的那样:你的关闭指令
!OMP end Critical
在之后缺少一个$
代码>
它被视为注释并被忽略。2刷新
指令的意义是什么,因为关键
意味着在进入和退出该区域时进行完整的刷新
?我怀疑这与您的问题有关,但是,如果只是为了代码的清晰性,应该删除2flush
指令。您使用哪种编译器?你确定你准确地复制了代码吗?你的结束指令!OMP end Critical
在之后缺少一个$
代码>。正如@HristoIliev的评论所表明的,这似乎是一个简单的打字错误造成的。投票结束。
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