在Fortran中使用CYCLE指令的Newbie OpenACC问题

时间:2017-05-11 15:57:26

标签: openacc

这是OpenACC的新手,所以请耐心等待:-)

我正在尝试移植一些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

0 个答案:

没有答案