induction variable live-out from loop

**!$acc parallel loop copyout(a)
do i = 1, N
k = 0
!$acc loop reduction(+:k)
do j = 1, M
k = k + 1
enddo
a(i) = k
enddo

When I compiler this code, it gives “Accelerator restriction: induction variable live-out from loop: k”. Can anybody help me?**

Hi zhjm,

Add “k” to a private clause on the outer loop.

% cat test.F90

#define N 32
#define M 128

program foo
 integer i, j, k
 integer, dimension(N) :: a
#ifdef USE_PRIVATE
!$acc parallel loop copyout(a) private(k)
#else
!$acc parallel loop copyout(a)
#endif
do i = 1, N
k = 0
!$acc loop reduction(+:k)
do j = 1, M
k = k + 1
enddo
a(i) = k
enddo

print *, a

end program foo

% pgfortran test.F90 -ta=tesla -Minfo=accel
foo:
     11, Generating copyout(a(:))
         Generating Tesla code
         13, !$acc loop gang, vector(32) ! blockidx%x threadidx%x
         16, !$acc loop seq
     17, Accelerator restriction: induction variable live-out from loop: k
% pgfortran test.F90 -ta=tesla -Minfo=accel -DUSE_PRIVATE
foo:
      9, Generating copyout(a(:))
         Generating Tesla code
         13, !$acc loop gang ! blockidx%x
         16, !$acc loop vector(128) ! threadidx%x
             Generating reduction(+:k)
     16, Loop is parallelizable

-Mat