diff options
Diffstat (limited to 'libgomp/testsuite/libgomp.fortran/task-detach-6.f90')
-rw-r--r-- | libgomp/testsuite/libgomp.fortran/task-detach-6.f90 | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/libgomp/testsuite/libgomp.fortran/task-detach-6.f90 b/libgomp/testsuite/libgomp.fortran/task-detach-6.f90 new file mode 100644 index 00000000000..0fe21553494 --- /dev/null +++ b/libgomp/testsuite/libgomp.fortran/task-detach-6.f90 @@ -0,0 +1,44 @@ +! { dg-do run } + +! 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 + + !$omp target map(tofrom: x, y, z) map(from: thread_count) + !$omp parallel firstprivate(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 taskwait + !$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 |