44 lines
1.1 KiB
Fortran
44 lines
1.1 KiB
Fortran
! { dg-do run }
|
|
|
|
! Test tasks with detach clause on an offload device. Each device
|
|
! thread spawns off a chain of tasks in a taskgroup, that can then
|
|
! be executed by any available thread.
|
|
|
|
program task_detach_10
|
|
use omp_lib
|
|
|
|
integer (kind=omp_event_handle_kind) :: detach_event1, detach_event2
|
|
integer :: x = 0, y = 0, z = 0
|
|
integer :: thread_count
|
|
|
|
!$omp target map (tofrom: x, y, z) map (from: thread_count)
|
|
!$omp parallel private (detach_event1, detach_event2)
|
|
!$omp taskgroup
|
|
!$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 taskgroup
|
|
!$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
|