我正在尝试移植一些Fortran代码以使用OpenACC,我发现了一个奇怪的(至少对我而言)行为。
代码如下所示,但正如您所看到的,只是一些嵌套循环最终更新变量zc,我将其复制出来。我试图在我认为需要的地方制作私人副本,并且目前指定所有循环都是独立的。现在,当我使用和不使用OpenACC进行编译时,如果我删除行“if(mu2-mup2.ne.q2)cycle”,但是如果该行存在,那么使用OpenACC计算的zc的结果是非常不同的没有OpenACC计算的那些。
为什么这条线可能给我带来麻烦?
非常感谢, ÁngeldeVicente
!$acc data copyout(zc)
!$acc update device(fact)
!$acc kernels
!$acc loop independent private(k2)
do k=kmin,kmax
k2=2*k
!$acc loop independent private(km,kp2,z0)
do kp=kmin,kmax
km = MIN(k,kp)
kp2=2*kp
z0=3.d0*dble(ju2+1)*dsqrt(dble(k2+1))*dsqrt(dble(kp2+1))
!$acc loop independent private(q2)
do q=-km,km
q2=2*q
!$acc loop independent
do mu2=-ju2,ju2,2
!$acc loop independent private(p2,z1)
do ml2=-jl2,jl2,2
p2=mu2-ml2
if(iabs(p2).gt.2) cycle
z1=w3js(ju2,jl2,2,mu2,-ml2,-p2)
!$acc loop independent private(pp2,z2)
do mup2=-ju2,ju2,2
if(mu2-mup2.ne.q2) cycle
pp2=mup2-ml2
if(iabs(pp2).gt.2) cycle
z2=w3js(ju2,jl2,2,mup2,-ml2,-pp2)
!$acc loop independent
do mlp2=-jl2,jl2,2
zc(ml2,mlp2,mu2,mup2,k,kp,q) = z2
enddo
enddo
enddo
enddo
end do
end do
end do
!$acc end kernels
!$acc end data