Dear experts,

sorry if this is a stupid question, but I was playing with offloading for
the nvptx-none target and found different behavior between e.g. gfortran-10
on OpenSuse and the Nvidia compiler (nvfortran) for the attached code.

With "nvfortran -mp=multicore offload-test.f90" the code prints:

    2.000000        2000.000
 s1:    1001000.
 s2:    1001000.

With "/usr/bin/gfortran-10 -fopenmp -foffload=nvptx-none offload-test.f90":

   2.00000000       2000.00000
 s1:   1001000.00
 s2:   0.00000000

The core difference between the evaluations s1 and s2 is:

s1:

!$omp target data map(a,s)
!$omp target teams reduction(+:s) map(s)
    do i = 1, n
       s = s + a(i)
    end do
!$omp end target teams
!$omp end target data

s2:

!$omp target data map(a,s)
!$omp target teams reduction(+:s)
    do i = 1, n
       s = s + a(i)
    end do
!$omp end target teams
!$omp end target data

I was assuming that the map clause in the reduction should not be necessary,
but the result seems to tell me that either I am wrong (and gfortran is right),
or nvfortran is wrong.

With OpenACC this seems to be different; at least a simple example I tried
with the reduction within an !$acc data ... !$acc end data did not show
unexpected behavior.

Can anybody tell me that I am wrong (and point me to the right place in the
OpenMP standard), or should I open a PR?

Thanks
Harald
program p5
  implicit none
  integer           :: i, n = 1000
  real              :: s
  real, allocatable :: a(:)
  allocate (a(n))
  do i = 1, n
     a(i) = 2*i
  end do
  print *, a(1),a(n)
  call s1 ()
  print *, "s1:", s
  call s2 ()
  print *, "s2:", s
contains
  subroutine s1 ()
    integer :: i
    s = 0.
!$omp target data map(a,s)
!$omp target teams reduction(+:s) map(s)
    do i = 1, n
       s = s + a(i)
    end do
!$omp end target teams
!$omp end target data
  end subroutine s1
  !----------------
  subroutine s2 ()
    integer :: i
    s = 0.
!$omp target data map(a,s)
!$omp target teams reduction(+:s)
    do i = 1, n
       s = s + a(i)
    end do
!$omp end target teams
!$omp end target data
  end subroutine s2
end program

Reply via email to