为什么我的OpenMP代码减少会给出错误的结果?

时间:2018-03-07 19:19:35

标签: fortran openmp reduction

我的Fortran代码如下:

!     ...................... initialization

      do ia=1,NLEV
      do ic=1,NLEV
            ZGamma(ia,ic)  =zero
      enddo
      enddo

!$OMP PARALLEL DEFAULT(PRIVATE) SHARED(H,ZRO) REDUCTION(+: ZGamma)

!$OMP DO SCHEDULE(DYNAMIC) 

      do iabcd=1,H%iabcd_max
          ia = H%ka(iabcd)
          ib = H%kb(iabcd)
          ic = H%kc(iabcd)
          id = H%kd(iabcd)

          ZGamma(ia,ic)=ZGamma(ia,ic) + H%ME2BM(iabcd)*ZRO(id,ib)
          ZGamma(ib,ic)=ZGamma(ib,ic) - H%ME2BM(iabcd)*ZRO(id,ia)
          ZGamma(ia,id)=ZGamma(ia,id) - H%ME2BM(iabcd)*ZRO(ic,ib)
          ZGamma(ib,id)=ZGamma(ib,id) + H%ME2BM(iabcd)*ZRO(ic,ia)

          if(ia+ib.eq.ic+id) cycle
          ZGamma(ic,ia)=ZGamma(ic,ia) + H%ME2BM(iabcd)*ZRO(ib,id)
          ZGamma(id,ia)=ZGamma(id,ia) - H%ME2BM(iabcd)*ZRO(ib,ic)

          ZGamma(ic,ib)=ZGamma(ic,ib) - H%ME2BM(iabcd)*ZRO(ia,id)
          ZGamma(id,ib)=ZGamma(id,ib) + H%ME2BM(iabcd)*ZRO(ia,ic)

       enddo ! iabcd
!$OMP END DO

!$OMP END PARALLEL

在上面的代码中,我使用OpenMP计算了2D数组ZGamma(i,j)。即使我可以编译代码没有任何问题。谁能告诉我代码中的问题是什么?我应该做些什么改变?

顺便说一下,作为索引" iabcd"从" 1"到" H%iabcd_max","(ia,ib,ic,id)"的值可以是"(1,1,1,1),(1,1,1,2),(1,1,1,...),(1,1,2,1),(1 ,1,2,...),"等

0 个答案:

没有答案