1! { dg-do compile { target skip-all-targets } } 2! Only used by taskloop-5-a.f90 3! To avoid inlining 4 5module m2 6 use m_taskloop5 7 implicit none (external, type) 8contains 9 10subroutine grainsize (a, b, c, d) 11 integer, value :: a, b, c, d 12 integer :: i, j, k 13 j = 0 14 k = 0 15 !$omp taskloop firstprivate (j, k) grainsize(strict:d) 16 do i = a, b - 1, c 17 if (j == 0) then 18 !$omp atomic capture 19 k = v 20 v = v + 1 21 !$omp end atomic 22 if (k >= 64) & 23 stop 3 24 w(k) = i 25 end if 26 j = j + 1 27 u(k) = j 28 end do 29end 30 31subroutine num_tasks (a, b, c, d) 32 integer, value :: a, b, c, d 33 integer :: i, j, k 34 j = 0 35 k = 0 36 !$omp taskloop firstprivate (j, k) num_tasks(strict:d) 37 do i = a, b - 1, c 38 if (j == 0) then 39 !$omp atomic capture 40 k = v 41 v = v + 1 42 !$omp end atomic 43 if (k >= 64) & 44 stop 4 45 w(k) = i 46 end if 47 j = j + 1 48 u(k) = j 49 end do 50end 51end module 52 53program main 54 use m2 55 implicit none (external, type) 56 !$omp parallel 57 !$omp single 58 block 59 integer :: min_iters, max_iters, ntasks, sep 60 61 ! If grainsize is present and has strict modifier, # of task loop iters is == grainsize, 62 ! except that it can be smaller on the last task. 63 if (test (0, 79, 1, 17, grainsize, ntasks, min_iters, max_iters, sep) /= 79) & 64 stop 5 65 if (ntasks /= 5 .or. min_iters /= 11 .or. max_iters /= 17 .or. sep /= 4) & 66 stop 67 if (test (-49, 2541, 7, 28, grainsize, ntasks, min_iters, max_iters, sep) /= 370) & 68 stop 6 69 if (ntasks /= 14 .or. min_iters /= 6 .or. max_iters /= 28 .or. sep /= 13) & 70 stop 71 if (test (7, 21, 2, 15, grainsize, ntasks, min_iters, max_iters, sep) /= 7) & 72 stop 7 73 if (ntasks /= 1 .or. min_iters /= 7 .or. max_iters /= 7 .or. sep /= 1) & 74 stop 8 75 ! If num_tasks is present, # of tasks is min (# of loop iters, num_tasks) 76 ! and each task has at least one iteration. If strict modifier is present, 77 ! first set of tasks has ceil (# of loop iters / num_tasks) iterations, 78 ! followed by possibly empty set of tasks with floor (# of loop iters / num_tasks) 79 ! iterations. 80 if (test (-51, 2500, 48, 9, num_tasks, ntasks, min_iters, max_iters, sep) /= 54) & 81 stop 9 82 if (ntasks /= 9 .or. min_iters /= 6 .or. max_iters /= 6 .or. sep /= 9) & 83 stop 10 84 if (test (0, 57, 1, 9, num_tasks, ntasks, min_iters, max_iters, sep) /= 57) & 85 stop 11 86 if (ntasks /= 9 .or. min_iters /= 6 .or. max_iters /= 7 .or. sep /= 3) & 87 stop 12 88 if (test (0, 25, 2, 17, num_tasks, ntasks, min_iters, max_iters, sep) /= 13) & 89 stop 13 90 if (ntasks /= 13 .or. min_iters /= 1 .or. max_iters /= 1 .or. sep /= 13) & 91 stop 14 92 end block 93 !$omp end single 94 !$omp end parallel 95end program 96