| ! { dg-do run } |
| ! { dg-options "-fno-inline -fno-ipa-sra -fno-ipa-cp -fno-ipa-cp-clone" } |
| ! { dg-set-target-env-var OMP_CANCELLATION "true" } |
| |
| use omp_lib |
| integer :: x, i, j |
| common /x/ x |
| |
| call omp_set_dynamic (.false.) |
| call omp_set_schedule (omp_sched_static, 1) |
| !$omp parallel num_threads(16) private (i, j) |
| call do_some_work |
| !$omp barrier |
| if (omp_get_thread_num ().eq.1) then |
| call sleep (2) |
| !$omp cancellation point parallel |
| end if |
| do j = 3, 16 |
| !$omp do schedule(runtime) |
| do i = 0, j - 1 |
| call do_some_work |
| end do |
| !$omp enddo nowait |
| end do |
| if (omp_get_thread_num ().eq.0) then |
| call sleep (1) |
| !$omp cancel parallel |
| end if |
| !$omp end parallel |
| contains |
| subroutine do_some_work |
| integer :: x |
| common /x/ x |
| !$omp atomic |
| x = x + 1 |
| !$omp end atomic |
| endsubroutine do_some_work |
| end |