4dd9e1c541
... still awaiting proper resolution, of course. libgomp/ PR target/99555 * testsuite/lib/libgomp.exp (check_effective_target_offload_device_nvptx): New. * testsuite/libgomp.c/pr99555-1.c <nvptx offload device>: Until resolved, make sure that we exit quickly, with error status, XFAILed. * testsuite/libgomp.c-c++-common/task-detach-6.c: Likewise. * testsuite/libgomp.fortran/task-detach-6.f90: Likewise.
57 lines
1.6 KiB
Fortran
57 lines
1.6 KiB
Fortran
! { dg-do run }
|
|
|
|
! { dg-additional-sources on_device_arch.c }
|
|
! { dg-prune-output "command-line option '-fintrinsic-modules-path=.*' is valid for Fortran but not for C" }
|
|
|
|
! Test tasks with detach clause on an offload device. Each device
|
|
! thread spawns off a chain of tasks, that can then be executed by
|
|
! any available thread.
|
|
|
|
program task_detach_6
|
|
use omp_lib
|
|
|
|
integer (kind=omp_event_handle_kind) :: detach_event1, detach_event2
|
|
integer :: x = 0, y = 0, z = 0
|
|
integer :: thread_count
|
|
|
|
interface
|
|
integer function on_device_arch_nvptx() bind(C)
|
|
end function on_device_arch_nvptx
|
|
end interface
|
|
|
|
!TODO See '../libgomp.c/pr99555-1.c'.
|
|
if (on_device_arch_nvptx () /= 0) then
|
|
call alarm (4, 0); !TODO Until resolved, make sure that we exit quickly, with error status.
|
|
! { dg-xfail-run-if "PR99555" { offload_device_nvptx } }
|
|
end if
|
|
|
|
!$omp target map (tofrom: x, y, z) map (from: thread_count)
|
|
!$omp parallel private (detach_event1, detach_event2)
|
|
!$omp single
|
|
thread_count = omp_get_num_threads ()
|
|
!$omp end single
|
|
|
|
!$omp task detach (detach_event1) untied
|
|
!$omp atomic update
|
|
x = x + 1
|
|
!$omp end task
|
|
|
|
!$omp task detach (detach_event2) untied
|
|
!$omp atomic update
|
|
y = y + 1
|
|
call omp_fulfill_event (detach_event1)
|
|
!$omp end task
|
|
|
|
!$omp task untied
|
|
!$omp atomic update
|
|
z = z + 1
|
|
call omp_fulfill_event (detach_event2)
|
|
!$omp end task
|
|
!$omp end parallel
|
|
!$omp end target
|
|
|
|
if (x /= thread_count) stop 1
|
|
if (y /= thread_count) stop 2
|
|
if (z /= thread_count) stop 3
|
|
end program
|