1! { dg-do run } 2 3! Test tasks with detach clause. Each thread spawns off a chain of tasks 4! in a taskgroup, that can then be executed by any available thread. 5 6program task_detach_9 7 use omp_lib 8 9 integer (kind=omp_event_handle_kind) :: detach_event1, detach_event2 10 integer :: x = 0, y = 0, z = 0 11 integer :: thread_count 12 13 !$omp parallel private (detach_event1, detach_event2) 14 !$omp taskgroup 15 !$omp single 16 thread_count = omp_get_num_threads () 17 !$omp end single 18 19 !$omp task detach (detach_event1) untied 20 !$omp atomic update 21 x = x + 1 22 !$omp end task 23 24 !$omp task detach (detach_event2) untied 25 !$omp atomic update 26 y = y + 1 27 call omp_fulfill_event (detach_event1); 28 !$omp end task 29 30 !$omp task untied 31 !$omp atomic update 32 z = z + 1 33 call omp_fulfill_event (detach_event2); 34 !$omp end task 35 !$omp end taskgroup 36 !$omp end parallel 37 38 if (x /= thread_count) stop 1 39 if (y /= thread_count) stop 2 40 if (z /= thread_count) stop 3 41end program 42