Hi,
This is a follow-up query on using openacc directives with multi-index do concurrent loops (Do concurrent + openacc pragmas parallelism behavior).
I noticed that if I have a do concurrent in an openacc parallel region and compiling with both -acc=gpu and -stdpar=gpu, the compiler doesn’t properly parallelise the inner loop despite having collapse(2). E.g. see below MRE.
! loop_example.f90
program loop_example
implicit none
integer, parameter :: ni = 10, nj = 10, nk = 5
real :: a(ni, nj, nk), b(ni, nj)
integer :: i, j, k
! Initialize
a = 1.0
! Regular nested do loops: outer k reduction into 2D array
b = 0.0
!$acc parallel
!$loop seq
do k = 1, nk
!$acc loop collapse(2)
do j = 1, nj
do i = 1, ni
b(i, j) = b(i, j) + a(i, j, k) * k
enddo
enddo
enddo
!$acc end parallel
! Do concurrent: outer k reduction into 2D array
b = 0.0
!$acc parallel
!$acc loop seq
do k = 1, nk
!$acc loop collapse(2)
do concurrent (j = 1:nj, i = 1:ni)
b(i, j) = b(i, j) + a(i, j, k) * k
enddo
enddo
!$acc end parallel
end program loop_example
compiling with nvfortran -acc=gpu -Minfo=all loop_example.f90 -stdpar=gpu I get Minfo output:
loop_example:
13, Generating implicit firstprivate(k)
Generating NVIDIA GPU code
15, !$acc loop seq
17, !$acc loop gang, vector(96) collapse(2) ! blockidx%x threadidx%x
18, ! blockidx%x threadidx%x collapsed
27, Generating NVIDIA GPU code
29, !$acc loop seq
31, !$acc loop seq
You can see that loop on 31 doesn’t get parallelized at all and the non do concurrent loop does. When compiling without -stdpar=gpu:
27, Generating NVIDIA GPU code
29, !$acc loop seq
31, ! blockidx%x threadidx%x collapsed
!$acc loop gang, vector(96) collapse(2) ! blockidx%x threadidx%x
the loop is parallelised properly.
This is with nvhpc 26.1.