| ! { dg-do compile { target skip-all-targets } } |
| ! Only used by taskloop-4.f90 |
| ! To avoid inlining |
| |
| module m2 |
| use m_taskloop4 |
| implicit none (external, type) |
| contains |
| |
| subroutine grainsize (a, b, c, d) |
| integer, value :: a, b, c, d |
| integer :: i, j, k |
| j = 0 |
| k = 0 |
| !$omp taskloop firstprivate (j, k) grainsize(d) |
| do i = a, b - 1, c |
| if (j == 0) then |
| !$omp atomic capture |
| k = v |
| v = v + 1 |
| !$omp end atomic |
| if (k >= 64) & |
| stop 1 |
| end if |
| j = j + 1 |
| u(k) = j |
| end do |
| end |
| |
| subroutine num_tasks (a, b, c, d) |
| integer, value :: a, b, c, d |
| integer :: i, j, k |
| j = 0 |
| k = 0 |
| !$omp taskloop firstprivate (j, k) num_tasks(d) |
| do i = a, b - 1, c |
| if (j == 0) then |
| !$omp atomic capture |
| k = v |
| v = v + 1 |
| !$omp end atomic |
| if (k >= 64) & |
| stop 2 |
| end if |
| j = j + 1 |
| u(k) = j |
| end do |
| end |
| end module |
| |
| program main |
| use m2 |
| implicit none (external, type) |
| !$omp parallel |
| !$omp single |
| block |
| integer :: min_iters, max_iters, ntasks |
| |
| ! If grainsize is present, # of task loop iters is >= grainsize && < 2 * grainsize, |
| ! unless # of loop iterations is smaller than grainsize. |
| if (test (0, 79, 1, 17, grainsize, ntasks, min_iters, max_iters) /= 79) & |
| stop 3 |
| if (min_iters < 17 .or. max_iters >= 17 * 2) & |
| stop 4 |
| if (test (-49, 2541, 7, 28, grainsize, ntasks, min_iters, max_iters) /= 370) & |
| stop 5 |
| if (min_iters < 28 .or. max_iters >= 28 * 2) & |
| stop 6 |
| if (test (7, 21, 2, 15, grainsize, ntasks, min_iters, max_iters) /= 7) & |
| stop 7 |
| if (ntasks /= 1 .or. min_iters /= 7 .or. max_iters /= 7) & |
| stop 8 |
| ! If num_tasks is present, # of tasks is min (# of loop iters, num_tasks) |
| ! and each task has at least one iteration. |
| if (test (-51, 2500, 48, 9, num_tasks, ntasks, min_iters, max_iters) /= 54) & |
| stop 9 |
| if (ntasks /= 9) & |
| stop 10 |
| if (test (0, 25, 2, 17, num_tasks, ntasks, min_iters, max_iters) /= 13) & |
| stop 11 |
| if (ntasks /= 13) & |
| stop 12 |
| end block |
| !$omp end single |
| !$omp end parallel |
| end program |