optional-declare.f90 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. ! Test OpenACC declare directives with optional arguments.
  2. ! { dg-do run }
  3. program test
  4. implicit none
  5. integer, parameter :: n = 64
  6. integer :: i
  7. integer :: a_int, b_int, c_int, res_int
  8. integer :: a_arr(n), b_arr(n), c_arr(n), res_arr(n)
  9. a_int = 7
  10. b_int = 3
  11. c_int = 11
  12. call test_int(res_int, a_int)
  13. if (res_int .ne. a_int) stop 1
  14. call test_int(res_int, a_int, b_int)
  15. if (res_int .ne. a_int * b_int) stop 2
  16. call test_int(res_int, a_int, b_int, c_int)
  17. if (res_int .ne. a_int * b_int + c_int) stop 3
  18. do i = 1, n
  19. a_arr(i) = i
  20. b_arr(i) = n - i + 1
  21. c_arr(i) = i * 3
  22. end do
  23. call test_array(res_arr, a_arr)
  24. do i = 1, n
  25. if (res_arr(i) .ne. a_arr(i)) stop 4
  26. end do
  27. call test_array(res_arr, a_arr, b_arr)
  28. do i = 1, n
  29. if (res_arr(i) .ne. a_arr(i) * b_arr(i)) stop 5
  30. end do
  31. call test_array(res_arr, a_arr, b_arr, c_arr)
  32. do i = 1, n
  33. if (res_arr(i) .ne. a_arr(i) * b_arr(i) + c_arr(i)) stop 6
  34. end do
  35. contains
  36. subroutine test_int(res, a, b, c)
  37. integer :: a
  38. integer, optional :: b, c
  39. !$acc declare present_or_copyin(a, b, c)
  40. integer :: res
  41. !$acc declare present_or_copyout(res)
  42. !$acc parallel
  43. res = a
  44. if (present(b)) res = res * b
  45. if (present(c)) res = res + c
  46. !$acc end parallel
  47. end subroutine test_int
  48. subroutine test_array(res, a, b, c)
  49. integer :: a(n)
  50. integer, optional :: b(n), c(n)
  51. !$acc declare present_or_copyin(a, b, c)
  52. integer :: res(n)
  53. !$acc declare present_or_copyout(res)
  54. !$acc parallel loop
  55. do i = 1, n
  56. res(i) = a(i)
  57. end do
  58. !$acc parallel loop
  59. do i = 1, n
  60. if (present(b)) then
  61. res(i) = res(i) * b(i)
  62. end if
  63. end do
  64. !$acc parallel loop
  65. do i = 1, n
  66. if (present(c)) then
  67. res(i) = res(i) + c(i)
  68. end if
  69. end do
  70. end subroutine test_array
  71. end program test