1module m 2 use omp_lib, only: omp_depend_kind 3 implicit none (type, external) 4 integer :: xx 5 integer(omp_depend_kind) :: dd1, dd2 6contains 7 subroutine dep 8 integer :: x 9 integer(omp_depend_kind) :: d1, d2 10 x = 1 11 12 !$omp depobj (d1) depend(in: x) 13 !$omp depobj (d2) depend(in: x) 14 !$omp depobj (d2) update(out) 15 !$omp parallel 16 !$omp single 17 !$omp task shared (x) depend(depobj: d2) 18 x = 2 19 !$omp end task 20 !$omp task shared (x) depend(depobj: d1) 21 if (x /= 2) & 22 stop 1 23 !$omp end task 24 !$omp end single 25 !$omp end parallel 26 !$omp depobj (d2) destroy 27 !$omp depobj (d1) destroy 28 end 29 30 subroutine dep2 31 integer(omp_depend_kind) :: d1, d2 32 pointer :: d1 33 allocate(d1) 34 call dep2i(d1, d2) 35 deallocate(d1) 36 contains 37 subroutine dep2i(d1, d2) 38 integer(omp_depend_kind) :: d1 39 integer(omp_depend_kind), optional :: d2 40 pointer :: d1 41 !$omp parallel 42 !$omp single 43 block 44 integer :: x 45 x = 1 46 !$omp depobj (d1) depend(out: x) 47 !$omp depobj (d2) depend (in:x) 48 !$omp depobj(d2)update(in) 49 !$omp task shared (x) depend(depobj:d1) 50 x = 2 51 !$omp end task 52 !$omp task shared (x) depend(depobj : d2) 53 if (x /= 2) & 54 stop 2 55 !$omp end task 56 !$omp taskwait 57 !$omp depobj(d1)destroy 58 !$omp depobj(d2) destroy 59 end block 60 !$omp end single 61 !$omp end parallel 62 end 63 end 64 65 subroutine dep3 66 integer(omp_depend_kind) :: d(2) 67 !$omp parallel 68 block 69 integer :: x 70 x = 1 71 !$omp single 72 !$omp depobj(d(1)) depend(out:x) 73 !$omp depobj(d(2)) depend(in: x) 74 !$omp task shared (x) depend(depobj: d(1)) 75 x = 2 76 !$omp end task 77 !$omp task shared (x) depend(depobj: d(2)) 78 if (x /= 2) & 79 stop 3 80 !$omp end task 81 !$omp end single 82 end block 83 !$omp end parallel 84 !$omp depobj(d(1)) destroy 85 !$omp depobj(d(2)) destroy 86 end 87 88 subroutine antidep 89 xx = 1 90 !$omp parallel 91 !$omp single 92 !$omp task shared(xx) depend(depobj:dd2) 93 if (xx /= 1) & 94 stop 4 95 !$omp end task 96 !$omp task shared(xx) depend(depobj:dd1) 97 xx = 2 98 !$omp end task 99 !$omp end single 100 !$omp end parallel 101 end 102end module m 103 104program main 105 use m 106 implicit none (type, external) 107 call dep () 108 call dep2 () 109 call dep3 () 110 !$omp depobj (dd1) depend (inout: xx) 111 !$omp depobj (dd2) depend (in : xx) 112 call antidep () 113 !$omp depobj (dd2) destroy 114 !$omp depobj (dd1) destroy 115end program main 116