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