| ! { 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 |