asyncwait-1.f90 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. ! { dg-do run }
  2. program asyncwait
  3. integer, parameter :: N = 64
  4. real, allocatable :: a(:), b(:), c(:), d(:), e(:)
  5. integer i
  6. allocate (a(N))
  7. allocate (b(N))
  8. allocate (c(N))
  9. allocate (d(N))
  10. allocate (e(N))
  11. a(:) = 3.0
  12. b(:) = 0.0
  13. !$acc data copy (a(1:N)) copy (b(1:N))
  14. !$acc parallel async
  15. !$acc loop
  16. do i = 1, N
  17. b(i) = a(i)
  18. end do
  19. !$acc end parallel
  20. !$acc wait
  21. !$acc end data
  22. do i = 1, N
  23. if (a(i) .ne. 3.0) call abort
  24. if (b(i) .ne. 3.0) call abort
  25. end do
  26. a(:) = 2.0
  27. b(:) = 0.0
  28. !$acc data copy (a(1:N)) copy (b(1:N))
  29. !$acc parallel async (1)
  30. !$acc loop
  31. do i = 1, N
  32. b(i) = a(i)
  33. end do
  34. !$acc end parallel
  35. !$acc wait (1)
  36. !$acc end data
  37. do i = 1, N
  38. if (a(i) .ne. 2.0) call abort
  39. if (b(i) .ne. 2.0) call abort
  40. end do
  41. a(:) = 3.0
  42. b(:) = 0.0
  43. c(:) = 0.0
  44. d(:) = 0.0
  45. !$acc data copy (a(1:N)) copy (b(1:N)) copy (c(1:N)) copy (d(1:N))
  46. !$acc parallel async (1)
  47. do i = 1, N
  48. b(i) = (a(i) * a(i) * a(i)) / a(i)
  49. end do
  50. !$acc end parallel
  51. !$acc parallel async (1)
  52. do i = 1, N
  53. c(i) = (a(i) * 4) / a(i)
  54. end do
  55. !$acc end parallel
  56. !$acc parallel async (1)
  57. !$acc loop
  58. do i = 1, N
  59. d(i) = ((a(i) * a(i) + a(i)) / a(i)) - a(i)
  60. end do
  61. !$acc end parallel
  62. !$acc wait (1)
  63. !$acc end data
  64. do i = 1, N
  65. if (a(i) .ne. 3.0) call abort
  66. if (b(i) .ne. 9.0) call abort
  67. if (c(i) .ne. 4.0) call abort
  68. if (d(i) .ne. 1.0) call abort
  69. end do
  70. a(:) = 2.0
  71. b(:) = 0.0
  72. c(:) = 0.0
  73. d(:) = 0.0
  74. e(:) = 0.0
  75. !$acc data copy (a(1:N), b(1:N), c(1:N), d(1:N), e(1:N))
  76. !$acc parallel async (1)
  77. do i = 1, N
  78. b(i) = (a(i) * a(i) * a(i)) / a(i)
  79. end do
  80. !$acc end parallel
  81. !$acc parallel async (1)
  82. !$acc loop
  83. do i = 1, N
  84. c(i) = (a(i) * 4) / a(i)
  85. end do
  86. !$acc end parallel
  87. !$acc parallel async (1)
  88. !$acc loop
  89. do i = 1, N
  90. d(i) = ((a(i) * a(i) + a(i)) / a(i)) - a(i)
  91. end do
  92. !$acc end parallel
  93. !$acc parallel wait (1) async (1)
  94. !$acc loop
  95. do i = 1, N
  96. e(i) = a(i) + b(i) + c(i) + d(i)
  97. end do
  98. !$acc end parallel
  99. !$acc wait (1)
  100. !$acc end data
  101. do i = 1, N
  102. if (a(i) .ne. 2.0) call abort
  103. if (b(i) .ne. 4.0) call abort
  104. if (c(i) .ne. 4.0) call abort
  105. if (d(i) .ne. 1.0) call abort
  106. if (e(i) .ne. 11.0) call abort
  107. end do
  108. end program asyncwait