It appears that the RUNTIMES build prefers the x86-64-unknown-linux-gnu triple notation for the host. This fixes runtime / test breakages when compiler-rt is used as the CLANG_DEFAULT_RTLIB.
70 lines
2.3 KiB
Fortran
70 lines
2.3 KiB
Fortran
! Offloading test checking the use of the depend clause on
|
|
! the target construct
|
|
! REQUIRES: flang, amdgcn-amd-amdhsa
|
|
! UNSUPPORTED: nvptx64-nvidia-cuda
|
|
! UNSUPPORTED: nvptx64-nvidia-cuda-LTO
|
|
! UNSUPPORTED: aarch64-unknown-linux-gnu
|
|
! UNSUPPORTED: aarch64-unknown-linux-gnu-LTO
|
|
! UNSUPPORTED: x86_64-unknown-linux-gnu
|
|
! UNSUPPORTED: x86_64-unknown-linux-gnu-LTO
|
|
|
|
! RUN: %libomptarget-compile-fortran-run-and-check-generic
|
|
program main
|
|
implicit none
|
|
integer :: a = 0
|
|
INTERFACE
|
|
FUNCTION omp_get_device_num() BIND(C)
|
|
USE, INTRINSIC :: iso_c_binding, ONLY: C_INT
|
|
integer :: omp_get_device_num
|
|
END FUNCTION omp_get_device_num
|
|
END INTERFACE
|
|
|
|
call foo(5, a)
|
|
print*, "======= FORTRAN Test passed! ======="
|
|
print*, "foo(5) returned ", a, ", expected 6\n"
|
|
|
|
! stop 0
|
|
contains
|
|
subroutine foo(N, r)
|
|
integer, intent(in) :: N
|
|
integer, intent(out) :: r
|
|
integer :: z, i, accumulator
|
|
z = 1
|
|
accumulator = 0
|
|
! Spawn 3 threads
|
|
!$omp parallel num_threads(3)
|
|
|
|
! A single thread will then create two tasks - one is the 'producer' and
|
|
! potentially slower task that updates 'z' to 'N'. The second is an
|
|
! offloaded target task that increments 'z'. If the depend clauses work
|
|
! properly, the target task should wait for the 'producer' task to
|
|
! complete before incrementing 'z'. We use 'omp single' here because the
|
|
! depend clause establishes dependencies between sibling tasks only.
|
|
! This is the easiest way of creating two sibling tasks.
|
|
!$omp single
|
|
!$omp task depend(out: z) shared(z)
|
|
do i=1, 32766
|
|
! dumb loop nest to slow down the update of 'z'.
|
|
! Adding a function call slows down the producer to the point
|
|
! that removing the depend clause from the target construct below
|
|
! frequently results in the wrong answer.
|
|
accumulator = accumulator + omp_get_device_num()
|
|
end do
|
|
z = N
|
|
!$omp end task
|
|
|
|
! z is 5 now. Increment z to 6.
|
|
!$omp target map(tofrom: z) depend(in:z)
|
|
z = z + 1
|
|
!$omp end target
|
|
!$omp end single
|
|
!$omp end parallel
|
|
! Use 'accumulator' so it is not optimized away by the compiler.
|
|
print *, accumulator
|
|
r = z
|
|
end subroutine foo
|
|
|
|
!CHECK: ======= FORTRAN Test passed! =======
|
|
!CHECK: foo(5) returned 6 , expected 6
|
|
end program main
|