1! Test ACC UPDATE with derived types. 2 3! { dg-do run } 4 5module dt 6 integer, parameter :: n = 10 7 type inner 8 integer :: d(n) 9 end type inner 10 type mytype 11 integer(8) :: a, b, c(n) 12 type(inner) :: in 13 end type mytype 14end module dt 15 16program derived_acc 17 use dt 18 19 implicit none 20 integer i, res 21 type(mytype) :: var 22 23 var%a = 0 24 var%b = 1 25 var%c(:) = 10 26 var%in%d(:) = 100 27 28 var%c(:) = 10 29 30 !$acc enter data copyin(var) 31 32 !$acc parallel loop present(var) 33 do i = 1, 1 34 var%a = var%b 35 end do 36 !$acc end parallel loop 37 38 !$acc update host(var%a) 39 40 if (var%a /= var%b) stop 1 41 42 var%b = 100 43 44 !$acc update device(var%b) 45 46 !$acc parallel loop present(var) 47 do i = 1, 1 48 var%a = var%b 49 end do 50 !$acc end parallel loop 51 52 !$acc update host(var%a) 53 54 if (var%a /= var%b) stop 2 55 56 !$acc parallel loop present (var) 57 do i = 1, n 58 var%c(i) = i 59 end do 60 !$acc end parallel loop 61 62 !$acc update host(var%c) 63 64 var%a = -1 65 66 do i = 1, n 67 if (var%c(i) /= i) stop 3 68 var%c(i) = var%a 69 end do 70 71 !$acc update device(var%a) 72 !$acc update device(var%c) 73 74 res = 0 75 76 !$acc parallel loop present(var) reduction(+:res) 77 do i = 1, n 78 if (var%c(i) /= var%a) res = res + 1 79 end do 80 81 if (res /= 0) stop 4 82 83 var%c(:) = 0 84 85 !$acc update device(var%c) 86 87 !$acc parallel loop present(var) 88 do i = 5, 5 89 var%c(i) = 1 90 end do 91 !$acc end parallel loop 92 93 !$acc update host(var%c(5)) 94 95 do i = 1, n 96 if (i /= 5 .and. var%c(i) /= 0) stop 5 97 if (i == 5 .and. var%c(i) /= 1) stop 6 98 end do 99 100 !$acc parallel loop present(var) 101 do i = 1, n 102 var%in%d = var%a 103 end do 104 !$acc end parallel loop 105 106 !$acc update host(var%in%d) 107 108 do i = 1, n 109 if (var%in%d(i) /= var%a) stop 7 110 end do 111 112 var%c(:) = 0 113 114 !$acc update device(var%c) 115 116 var%c(:) = -1 117 118 !$acc parallel loop present(var) 119 do i = n/2, n 120 var%c(i) = i 121 end do 122 !$acc end parallel loop 123 124 !$acc update host(var%c(n/2:n)) 125 126 do i = 1,n 127 if (i < n/2 .and. var%c(i) /= -1) stop 8 128 if (i >= n/2 .and. var%c(i) /= i) stop 9 129 end do 130 131 var%in%d(:) = 0 132 !$acc update device(var%in%d) 133 134 !$acc parallel loop present(var) 135 do i = 5, 5 136 var%in%d(i) = 1 137 end do 138 !$acc end parallel loop 139 140 !$acc update host(var%in%d(5)) 141 142 do i = 1, n 143 if (i /= 5 .and. var%in%d(i) /= 0) stop 10 144 if (i == 5 .and. var%in%d(i) /= 1) stop 11 145 end do 146 147 !$acc exit data delete(var) 148 149 call derived_acc_subroutine(var) 150end program derived_acc 151 152subroutine derived_acc_subroutine(var) 153 use dt 154 155 implicit none 156 integer i, res 157 type(mytype) :: var 158 159 var%a = 0 160 var%b = 1 161 var%c(:) = 10 162 var%in%d(:) = 100 163 164 var%c(:) = 10 165 166 !$acc enter data copyin(var) 167 168 !$acc parallel loop present(var) 169 do i = 1, 1 170 var%a = var%b 171 end do 172 !$acc end parallel loop 173 174 !$acc update host(var%a) 175 176 if (var%a /= var%b) stop 12 177 178 var%b = 100 179 180 !$acc update device(var%b) 181 182 !$acc parallel loop present(var) 183 do i = 1, 1 184 var%a = var%b 185 end do 186 !$acc end parallel loop 187 188 !$acc update host(var%a) 189 190 if (var%a /= var%b) stop 13 191 192 !$acc parallel loop present (var) 193 do i = 1, n 194 var%c(i) = i 195 end do 196 !$acc end parallel loop 197 198 !$acc update host(var%c) 199 200 var%a = -1 201 202 do i = 1, n 203 if (var%c(i) /= i) stop 14 204 var%c(i) = var%a 205 end do 206 207 !$acc update device(var%a) 208 !$acc update device(var%c) 209 210 res = 0 211 212 !$acc parallel loop present(var) reduction(+:res) 213 do i = 1, n 214 if (var%c(i) /= var%a) res = res + 1 215 end do 216 217 if (res /= 0) stop 15 218 219 var%c(:) = 0 220 221 !$acc update device(var%c) 222 223 !$acc parallel loop present(var) 224 do i = 5, 5 225 var%c(i) = 1 226 end do 227 !$acc end parallel loop 228 229 !$acc update host(var%c(5)) 230 231 do i = 1, n 232 if (i /= 5 .and. var%c(i) /= 0) stop 16 233 if (i == 5 .and. var%c(i) /= 1) stop 17 234 end do 235 236 !$acc parallel loop present(var) 237 do i = 1, n 238 var%in%d = var%a 239 end do 240 !$acc end parallel loop 241 242 !$acc update host(var%in%d) 243 244 do i = 1, n 245 if (var%in%d(i) /= var%a) stop 18 246 end do 247 248 var%c(:) = 0 249 250 !$acc update device(var%c) 251 252 var%c(:) = -1 253 254 !$acc parallel loop present(var) 255 do i = n/2, n 256 var%c(i) = i 257 end do 258 !$acc end parallel loop 259 260 !$acc update host(var%c(n/2:n)) 261 262 do i = 1,n 263 if (i < n/2 .and. var%c(i) /= -1) stop 19 264 if (i >= n/2 .and. var%c(i) /= i) stop 20 265 end do 266 267 var%in%d(:) = 0 268 !$acc update device(var%in%d) 269 270 !$acc parallel loop present(var) 271 do i = 5, 5 272 var%in%d(i) = 1 273 end do 274 !$acc end parallel loop 275 276 !$acc update host(var%in%d(5)) 277 278 do i = 1, n 279 if (i /= 5 .and. var%in%d(i) /= 0) stop 21 280 if (i == 5 .and. var%in%d(i) /= 1) stop 22 281 end do 282 283 !$acc exit data delete(var) 284end subroutine derived_acc_subroutine 285