reduction-2.f90 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402
  1. ! { dg-do run }
  2. ! real reductions
  3. program reduction_2
  4. implicit none
  5. integer, parameter :: n = 10, ng = 8, nw = 4, vl = 32
  6. integer :: i
  7. real :: vresult, rg, rw, rv, rc
  8. real, parameter :: e = 0.001
  9. logical :: lrg, lrw, lrv, lrc, lvresult
  10. real, dimension (n) :: array
  11. do i = 1, n
  12. array(i) = i
  13. end do
  14. !
  15. ! '+' reductions
  16. !
  17. rg = 0
  18. rw = 0
  19. rv = 0
  20. rc = 0
  21. vresult = 0
  22. !$acc parallel num_gangs(ng) copy(rg)
  23. !$acc loop reduction(+:rg) gang
  24. do i = 1, n
  25. rg = rg + array(i)
  26. end do
  27. !$acc end parallel
  28. !$acc parallel num_workers(nw) copy(rw)
  29. !$acc loop reduction(+:rw) worker
  30. do i = 1, n
  31. rw = rw + array(i)
  32. end do
  33. !$acc end parallel
  34. !$acc parallel vector_length(vl) copy(rv)
  35. !$acc loop reduction(+:rv) vector
  36. do i = 1, n
  37. rv = rv + array(i)
  38. end do
  39. !$acc end parallel
  40. !$acc parallel num_gangs(ng) num_workers(nw) vector_length(vl) copy(rc)
  41. !$acc loop reduction(+:rc) gang worker vector
  42. do i = 1, n
  43. rc = rc + array(i)
  44. end do
  45. !$acc end parallel
  46. ! Verify the results
  47. do i = 1, n
  48. vresult = vresult + array(i)
  49. end do
  50. if (rg .ne. vresult) STOP 1
  51. if (rw .ne. vresult) STOP 2
  52. if (rv .ne. vresult) STOP 3
  53. if (rc .ne. vresult) STOP 4
  54. !
  55. ! '*' reductions
  56. !
  57. rg = 1
  58. rw = 1
  59. rv = 1
  60. rc = 1
  61. vresult = 1
  62. !$acc parallel num_gangs(ng) copy(rg)
  63. !$acc loop reduction(*:rg) gang
  64. do i = 1, n
  65. rg = rg * array(i)
  66. end do
  67. !$acc end parallel
  68. !$acc parallel num_workers(nw) copy(rw)
  69. !$acc loop reduction(*:rw) worker
  70. do i = 1, n
  71. rw = rw * array(i)
  72. end do
  73. !$acc end parallel
  74. !$acc parallel vector_length(vl) copy(rv)
  75. !$acc loop reduction(*:rv) vector
  76. do i = 1, n
  77. rv = rv * array(i)
  78. end do
  79. !$acc end parallel
  80. !$acc parallel num_gangs(ng) num_workers(nw) vector_length(vl) copy(rc)
  81. !$acc loop reduction(*:rc) gang worker vector
  82. do i = 1, n
  83. rc = rc * array(i)
  84. end do
  85. !$acc end parallel
  86. ! Verify the results
  87. do i = 1, n
  88. vresult = vresult * array(i)
  89. end do
  90. if (abs (rg - vresult) .ge. e) STOP 5
  91. if (abs (rw - vresult) .ge. e) STOP 6
  92. if (abs (rv - vresult) .ge. e) STOP 7
  93. if (abs (rc - vresult) .ge. e) STOP 8
  94. !
  95. ! 'max' reductions
  96. !
  97. rg = 0
  98. rw = 0
  99. rg = 0
  100. rc = 0
  101. vresult = 0
  102. !$acc parallel num_gangs(ng) copy(rg)
  103. !$acc loop reduction(max:rg) gang
  104. do i = 1, n
  105. rg = max (rg, array(i))
  106. end do
  107. !$acc end parallel
  108. !$acc parallel num_workers(nw) copy(rw)
  109. !$acc loop reduction(max:rw) worker
  110. do i = 1, n
  111. rw = max (rw, array(i))
  112. end do
  113. !$acc end parallel
  114. !$acc parallel vector_length(vl) copy(rv)
  115. !$acc loop reduction(max:rv) vector
  116. do i = 1, n
  117. rv = max (rv, array(i))
  118. end do
  119. !$acc end parallel
  120. !$acc parallel num_gangs(ng) num_workers(nw) vector_length(vl) copy(rc)
  121. !$acc loop reduction(max:rc) gang worker vector
  122. do i = 1, n
  123. rc = max (rc, array(i))
  124. end do
  125. !$acc end parallel
  126. ! Verify the results
  127. do i = 1, n
  128. vresult = max (vresult, array(i))
  129. end do
  130. if (abs (rg - vresult) .ge. e) STOP 9
  131. if (abs (rw - vresult) .ge. e) STOP 10
  132. if (abs (rg - vresult) .ge. e) STOP 11
  133. if (abs (rc - vresult) .ge. e) STOP 12
  134. !
  135. ! 'min' reductions
  136. !
  137. rg = 0
  138. rw = 0
  139. rv = 0
  140. rc = 0
  141. vresult = 0
  142. !$acc parallel num_gangs(ng) copy(rg)
  143. !$acc loop reduction(min:rg) gang
  144. do i = 1, n
  145. rg = min (rg, array(i))
  146. end do
  147. !$acc end parallel
  148. !$acc parallel num_workers(nw) copy(rw)
  149. !$acc loop reduction(min:rw) worker
  150. do i = 1, n
  151. rw = min (rw, array(i))
  152. end do
  153. !$acc end parallel
  154. !$acc parallel vector_length(vl) copy(rv)
  155. !$acc loop reduction(min:rv) vector
  156. do i = 1, n
  157. rv = min (rv, array(i))
  158. end do
  159. !$acc end parallel
  160. !$acc parallel num_gangs(ng) num_workers(nw) vector_length(vl) copy(rc)
  161. !$acc loop reduction(min:rc) gang worker vector
  162. do i = 1, n
  163. rc = min (rc, array(i))
  164. end do
  165. !$acc end parallel
  166. ! Verify the results
  167. do i = 1, n
  168. vresult = min (vresult, array(i))
  169. end do
  170. if (rg .ne. vresult) STOP 13
  171. if (rv .ne. vresult) STOP 14
  172. if (rw .ne. vresult) STOP 15
  173. if (rc .ne. vresult) STOP 16
  174. !
  175. ! '.and.' reductions
  176. !
  177. lrg = .true.
  178. lrw = .true.
  179. lrv = .true.
  180. lrc = .true.
  181. lvresult = .true.
  182. !$acc parallel num_gangs(ng) copy(lrg)
  183. !$acc loop reduction(.and.:lrg) gang
  184. do i = 1, n
  185. lrg = lrg .and. (array(i) .ge. 5)
  186. end do
  187. !$acc end parallel
  188. !$acc parallel num_workers(nw) copy(lrw)
  189. !$acc loop reduction(.and.:lrw) worker
  190. do i = 1, n
  191. lrw = lrw .and. (array(i) .ge. 5)
  192. end do
  193. !$acc end parallel
  194. !$acc parallel vector_length(vl) copy(lrv)
  195. !$acc loop reduction(.and.:lrv) vector
  196. do i = 1, n
  197. lrv = lrv .and. (array(i) .ge. 5)
  198. end do
  199. !$acc end parallel
  200. !$acc parallel num_gangs(ng) num_workers(nw) vector_length(vl) copy(lrc)
  201. !$acc loop reduction(.and.:lrc) gang worker vector
  202. do i = 1, n
  203. lrc = lrc .and. (array(i) .ge. 5)
  204. end do
  205. !$acc end parallel
  206. ! Verify the results
  207. do i = 1, n
  208. lvresult = lvresult .and. (array(i) .ge. 5)
  209. end do
  210. if (lrg .neqv. lvresult) STOP 17
  211. if (lrw .neqv. lvresult) STOP 18
  212. if (lrv .neqv. lvresult) STOP 19
  213. if (lrc .neqv. lvresult) STOP 20
  214. !
  215. ! '.or.' reductions
  216. !
  217. lrg = .false.
  218. lrw = .false.
  219. lrv = .false.
  220. lrc = .false.
  221. lvresult = .false.
  222. !$acc parallel num_gangs(ng) copy(lrg)
  223. !$acc loop reduction(.or.:lrg) gang
  224. do i = 1, n
  225. lrg = lrg .or. (array(i) .ge. 5)
  226. end do
  227. !$acc end parallel
  228. !$acc parallel num_workers(nw) copy(lrw)
  229. !$acc loop reduction(.or.:lrw) worker
  230. do i = 1, n
  231. lrw = lrw .or. (array(i) .ge. 5)
  232. end do
  233. !$acc end parallel
  234. !$acc parallel vector_length(vl) copy(lrv)
  235. !$acc loop reduction(.or.:lrv) vector
  236. do i = 1, n
  237. lrv = lrv .or. (array(i) .ge. 5)
  238. end do
  239. !$acc end parallel
  240. !$acc parallel num_gangs(ng) num_workers(nw) vector_length(vl) copy(lrc)
  241. !$acc loop reduction(.or.:lrc) gang worker vector
  242. do i = 1, n
  243. lrc = lrc .or. (array(i) .ge. 5)
  244. end do
  245. !$acc end parallel
  246. ! Verify the results
  247. do i = 1, n
  248. lvresult = lvresult .or. (array(i) .ge. 5)
  249. end do
  250. if (lrg .neqv. lvresult) STOP 21
  251. if (lrw .neqv. lvresult) STOP 22
  252. if (lrv .neqv. lvresult) STOP 23
  253. if (lrc .neqv. lvresult) STOP 24
  254. !
  255. ! '.eqv.' reductions
  256. !
  257. lrg = .true.
  258. lrw = .true.
  259. lrv = .true.
  260. lrc = .true.
  261. lvresult = .true.
  262. !$acc parallel num_gangs(ng) copy(lrg)
  263. !$acc loop reduction(.eqv.:lrg) gang
  264. do i = 1, n
  265. lrg = lrg .eqv. (array(i) .ge. 5)
  266. end do
  267. !$acc end parallel
  268. !$acc parallel num_workers(nw) copy(lrw)
  269. !$acc loop reduction(.eqv.:lrw) worker
  270. do i = 1, n
  271. lrw = lrw .eqv. (array(i) .ge. 5)
  272. end do
  273. !$acc end parallel
  274. !$acc parallel vector_length(vl) copy(lrv)
  275. !$acc loop reduction(.eqv.:lrv) vector
  276. do i = 1, n
  277. lrv = lrv .eqv. (array(i) .ge. 5)
  278. end do
  279. !$acc end parallel
  280. !$acc parallel num_gangs(ng) num_workers(nw) vector_length(vl) copy(lrc)
  281. !$acc loop reduction(.eqv.:lrc) gang worker vector
  282. do i = 1, n
  283. lrc = lrc .eqv. (array(i) .ge. 5)
  284. end do
  285. !$acc end parallel
  286. ! Verify the results
  287. do i = 1, n
  288. lvresult = lvresult .eqv. (array(i) .ge. 5)
  289. end do
  290. if (lrg .neqv. lvresult) STOP 25
  291. if (lrw .neqv. lvresult) STOP 26
  292. if (lrv .neqv. lvresult) STOP 27
  293. if (lrc .neqv. lvresult) STOP 28
  294. !
  295. ! '.neqv.' reductions
  296. !
  297. lrg = .true.
  298. lrw = .true.
  299. lrv = .true.
  300. lrc = .true.
  301. lvresult = .true.
  302. !$acc parallel num_gangs(ng) copy(lrg)
  303. !$acc loop reduction(.neqv.:lrg) gang
  304. do i = 1, n
  305. lrg = lrg .neqv. (array(i) .ge. 5)
  306. end do
  307. !$acc end parallel
  308. !$acc parallel num_workers(nw) copy(lrw)
  309. !$acc loop reduction(.neqv.:lrw) worker
  310. do i = 1, n
  311. lrw = lrw .neqv. (array(i) .ge. 5)
  312. end do
  313. !$acc end parallel
  314. !$acc parallel vector_length(vl) copy(lrv)
  315. !$acc loop reduction(.neqv.:lrv) vector
  316. do i = 1, n
  317. lrv = lrv .neqv. (array(i) .ge. 5)
  318. end do
  319. !$acc end parallel
  320. !$acc parallel num_gangs(ng) num_workers(nw) vector_length(vl) copy(lrc)
  321. !$acc loop reduction(.neqv.:lrc) gang worker vector
  322. do i = 1, n
  323. lrc = lrc .neqv. (array(i) .ge. 5)
  324. end do
  325. !$acc end parallel
  326. ! Verify the results
  327. do i = 1, n
  328. lvresult = lvresult .neqv. (array(i) .ge. 5)
  329. end do
  330. if (lrg .neqv. lvresult) STOP 29
  331. if (lrw .neqv. lvresult) STOP 30
  332. if (lrv .neqv. lvresult) STOP 31
  333. if (lrc .neqv. lvresult) STOP 32
  334. end program reduction_2