1! Copy of data-4.f90 with self exchanged with host for !acc update, and with 2! default (present) clauses added. 3 4! { dg-do run } 5 6program asyncwait 7 real, allocatable :: a(:), b(:), c(:), d(:), e(:) 8 integer i, N 9 10 N = 64 11 12 allocate (a(N)) 13 allocate (b(N)) 14 allocate (c(N)) 15 allocate (d(N)) 16 allocate (e(N)) 17 18 a(:) = 3.0 19 b(:) = 0.0 20 21 !$acc enter data copyin (a(1:N)) copyin (b(1:N)) copyin (N) async 22 23 !$acc parallel default (present) async wait 24 !$acc loop 25 do i = 1, N 26 b(i) = a(i) 27 end do 28 !$acc end parallel 29 30 !$acc update self (a(1:N), b(1:N)) async wait 31 !$acc wait 32 33 do i = 1, N 34 if (a(i) .ne. 3.0) STOP 1 35 if (b(i) .ne. 3.0) STOP 2 36 end do 37 38 a(:) = 2.0 39 b(:) = 0.0 40 41 !$acc update device (a(1:N), b(1:N)) async (1) 42 43 !$acc parallel default (present) async (1) wait (1) 44 !$acc loop 45 do i = 1, N 46 b(i) = a(i) 47 end do 48 !$acc end parallel 49 50 !$acc update host (a(1:N), b(1:N)) async (1) wait (1) 51 !$acc wait (1) 52 53 do i = 1, N 54 if (a(i) .ne. 2.0) STOP 3 55 if (b(i) .ne. 2.0) STOP 4 56 end do 57 58 a(:) = 3.0 59 b(:) = 0.0 60 c(:) = 0.0 61 d(:) = 0.0 62 63 !$acc enter data copyin (c(1:N), d(1:N)) async (1) 64 !$acc update device (a(1:N), b(1:N)) async (1) 65 66 !$acc parallel default (present) async (1) 67 do i = 1, N 68 b(i) = (a(i) * a(i) * a(i)) / a(i) 69 end do 70 !$acc end parallel 71 72 !$acc parallel default (present) async (1) 73 do i = 1, N 74 c(i) = (a(i) * 4) / a(i) 75 end do 76 !$acc end parallel 77 78 !$acc parallel default (present) async (1) 79 do i = 1, N 80 d(i) = ((a(i) * a(i) + a(i)) / a(i)) - a(i) 81 end do 82 !$acc end parallel 83 84 !$acc update self (a(1:N), b(1:N), c(1:N), d(1:N)) async (1) wait (1) 85 86 !$acc wait (1) 87 88 do i = 1, N 89 if (a(i) .ne. 3.0) STOP 5 90 if (b(i) .ne. 9.0) STOP 6 91 if (c(i) .ne. 4.0) STOP 7 92 if (d(i) .ne. 1.0) STOP 8 93 end do 94 95 a(:) = 2.0 96 b(:) = 0.0 97 c(:) = 0.0 98 d(:) = 0.0 99 e(:) = 0.0 100 101 !$acc enter data copyin (e(1:N)) async (1) 102 !$acc update device (a(1:N), b(1:N), c(1:N), d(1:N)) async (1) 103 104 !$acc parallel default (present) async (1) 105 do i = 1, N 106 b(i) = (a(i) * a(i) * a(i)) / a(i) 107 end do 108 !$acc end parallel 109 110 !$acc parallel default (present) async (1) 111 do i = 1, N 112 c(i) = (a(i) * 4) / a(i) 113 end do 114 !$acc end parallel 115 116 !$acc parallel default (present) async (1) 117 do i = 1, N 118 d(i) = ((a(i) * a(i) + a(i)) / a(i)) - a(i) 119 end do 120 !$acc end parallel 121 122 !$acc parallel default (present) wait (1) async (1) 123 do i = 1, N 124 e(i) = a(i) + b(i) + c(i) + d(i) 125 end do 126 !$acc end parallel 127 128 !$acc update self (a(1:N), b(1:N), c(1:N), d(1:N), e(1:N)) async (1) wait (1) 129 !$acc wait (1) 130 !$acc exit data delete (N, a(1:N), b(1:N), c(1:N), d(1:N), e(1:N)) 131 132 do i = 1, N 133 if (a(i) .ne. 2.0) STOP 9 134 if (b(i) .ne. 4.0) STOP 10 135 if (c(i) .ne. 4.0) STOP 11 136 if (d(i) .ne. 1.0) STOP 12 137 if (e(i) .ne. 11.0) STOP 13 138 end do 139end program asyncwait 140