zhjm
1
**!$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