Issue 136277
Summary [OpenMP][Flang] ‘Target update’ not working
Labels flang
Assignees
Reporter Yan-44
    Hi,
The simple program below reproduces one of the ‘target update’ issues occurring in a large Fortran code compiled with rocm-6.4.0/flang. It shows that ‘target update’ fails to update variable ‘val’. Why?
```
$ cat test39_target_update.f90

PROGRAM TARGET_UPDATE 
 use omp_lib
 implicit none
 integer, parameter :: Nmax=2500000
 integer :: i, nteams, nthreads
 logical :: initial_device, is_val_assigned_on_device
 double precision :: val
 double precision, dimension(:),allocatable :: X
 double precision,dimension(Nmax) :: expected
 
 !allocating and initialising
 allocate(X(Nmax))
 initial_device=.true.
 is_val_assigned_on_device=.false.
 do i = 1, Nmax
  expected(i) = -2._8
  X(i)=-2._8
 end do
 
 !$omp target data map(alloc:val) map(to:X)
 !checking correct assignment of 'X' on host for j=1058000 !randomly selected j value
 write(*,'(A,F6.1,A,F6.1)')"On host : X(1058000) = ",X(1058000),", expected X(1058000) = ",expected(1058000)
 !
 !$omp target map(tofrom:initial_device,is_val_assigned_on_device) map(from:nteams,nthreads)
 !Assigning 'val' on the device
 val=X(1058000)
 if (val==-2._8) is_val_assigned_on_device=.true.
 !$OMP teams distribute parallel do
 do i = 1, Nmax
   initial_device = omp_is_initial_device()
   X(i)=X(i)-val !hence, X(i) should be '0' if 'val' was correctly assigned
   !$ if (i==1) then
   !$  nteams= omp_get_num_teams()
   !$  nthreads= omp_get_num_threads()
   !$ end if
 end do
 !$omp end teams distribute parallel do
 !$OMP END TARGET

 if (initial_device) then
    write(*,*)"running on host"
    write(*,'(A,F6.1)')"val = ",val
 else
    write(*,'(A,I3,A,I3,A)')"running on device with ",nteams," teams and ",nthreads," threads"
    write(*,'(A,L1)')"is_val_assigned_on_device = ",is_val_assigned_on_device
    write(*,*)"-----------------"
    write(*,'(A)')"before update:"
    write(*,'(A,E13.2,A)')" val = ",val,", expected val = undetermined"
    write(*,'(A,F6.1,A,F6.1)')"X(1058000) =",X(1058000),",expected X(1058000) = ",expected(1058000)
    write(*,*)"---------------"
    !$OMP target update from(val)
    write(*,'(A,F6.1,A,F6.1)')"after update, val = ",val,", expected val = ",-2._8
    !$OMP target update from(X)
    write(*,'(A,F6.1,A,F6.1)')"X(1058000) =",X(1058000),", expected X(1058000) = ",0._8
 end if
 !$omp end target data
deallocate(X)
END PROGRAM
```
```
$ ./test39_target_update 
On host : X(1058000) =   -2.0, expected X(1058000) =   -2.0
running on device with 360 teams and 256 threads
is_val_assigned_on_device = T
 -----------------
before update:
 val =      0.00E+00, expected val = undetermined
X(1058000) =  -2.0,expected X(1058000) =   -2.0
 ---------------
after update, val =    0.0, expected val =   -2.0     <- 'TARGET UPDATE' failed
X(1058000) =   0.0, expected X(1058000) =    0.0
```
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to