common-block-2.f90 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. ! { dg-do run }
  2. !
  3. ! Test data located inside common blocks. This test does not exercise
  4. ! ACC DECLARE. All data clauses are explicit.
  5. module consts
  6. integer, parameter :: n = 100
  7. end module consts
  8. subroutine validate
  9. use consts
  10. implicit none
  11. integer i, j
  12. real*4 x(n), y(n), z
  13. common /BLOCK/ x, y, z, j
  14. do i = 1, n
  15. if (abs(x(i) - i - z) .ge. 0.0001) stop 1
  16. end do
  17. end subroutine validate
  18. subroutine incr
  19. use consts
  20. implicit none
  21. integer i, j
  22. real*4 x(n), y(n), z
  23. common /BLOCK/ x, y, z, j
  24. !$acc parallel loop pcopy(/BLOCK/)
  25. do i = 1, n
  26. x(i) = x(i) + z
  27. end do
  28. !$acc end parallel loop
  29. end subroutine incr
  30. program main
  31. use consts
  32. implicit none
  33. integer i, j
  34. real*4 a(n), b(n), c
  35. common /BLOCK/ a, b, c, j
  36. ! Test copyout, pcopy, device
  37. !$acc data copyout(a, c)
  38. c = 1.0
  39. !$acc update device(c)
  40. !$acc parallel loop pcopy(a)
  41. do i = 1, n
  42. a(i) = i
  43. end do
  44. !$acc end parallel loop
  45. call incr
  46. call incr
  47. call incr
  48. !$acc end data
  49. c = 3.0
  50. call validate
  51. ! Test pcopy without copyout
  52. c = 2.0
  53. call incr
  54. c = 5.0
  55. call validate
  56. ! Test create, delete, host, copyout, copyin
  57. !$acc enter data create(b)
  58. !$acc parallel loop pcopy(b)
  59. do i = 1, n
  60. b(i) = i
  61. end do
  62. !$acc end parallel loop
  63. !$acc update host (b)
  64. !$acc parallel loop pcopy(b) copyout(a) copyin(c)
  65. do i = 1, n
  66. a(i) = b(i) + c
  67. end do
  68. !$acc end parallel loop
  69. !$acc exit data delete(b)
  70. call validate
  71. a(:) = b(:)
  72. c = 0.0
  73. call validate
  74. ! Test copy
  75. c = 1.0
  76. !$acc parallel loop copy(/BLOCK/)
  77. do i = 1, n
  78. a(i) = b(i) + c
  79. end do
  80. !$acc end parallel loop
  81. call validate
  82. ! Test pcopyin, pcopyout FIXME
  83. c = 2.0
  84. !$acc data copyin(b, c) copyout(a)
  85. !$acc parallel loop pcopyin(b, c) pcopyout(a)
  86. do i = 1, n
  87. a(i) = b(i) + c
  88. end do
  89. !$acc end parallel loop
  90. !$acc end data
  91. call validate
  92. ! Test reduction, private
  93. j = 0
  94. !$acc parallel private(i) copy(j)
  95. !$acc loop reduction(+:j)
  96. do i = 1, n
  97. j = j + 1
  98. end do
  99. !$acc end parallel
  100. if (j .ne. n) stop 2
  101. ! Test firstprivate, copy
  102. a(:) = 0
  103. c = j
  104. !$acc parallel loop firstprivate(c) copyout(a)
  105. do i = 1, n
  106. a(i) = i + c
  107. end do
  108. !$acc end parallel loop
  109. call validate
  110. end program main