simd6.f90 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. ! { dg-do run }
  2. ! { dg-additional-options "-msse2" { target sse2_runtime } }
  3. ! { dg-additional-options "-mavx" { target avx_runtime } }
  4. interface
  5. subroutine foo (b, i, j, x)
  6. integer, intent (inout) :: b
  7. integer, intent (in) :: i, j, x
  8. end subroutine
  9. end interface
  10. integer :: i, j, b, c
  11. c = 0
  12. i = 4
  13. j = 4
  14. b = 7
  15. !$omp simd linear(b:2) reduction(+:c)
  16. do i = 0, 63
  17. c = c + b - (7 + 2 * i)
  18. call foo (b, i, j, 2)
  19. end do
  20. if (c /= 0 .or. i /= 64 .or. b /= 7 + 64 * 2) call abort
  21. i = 4
  22. j = 4
  23. b = 7
  24. !$omp simd linear(b:3) reduction(+:c)
  25. do i = 0, 63, 4
  26. c = c + b - (7 + i / 4 * 3)
  27. call foo (b, i, j, 3)
  28. end do
  29. if (c /= 0 .or. i /= 64 .or. b /= 7 + 16 * 3) call abort
  30. i = 4
  31. j = 4
  32. b = 7
  33. !$omp simd linear(i) linear(b:2) reduction(+:c)
  34. do i = 0, 63
  35. c = c + b - (7 + 2 * i)
  36. call foo (b, i, j, 2)
  37. end do
  38. if (c /= 0 .or. i /= 64 .or. b /= 7 + 64 * 2) call abort
  39. i = 4
  40. j = 4
  41. b = 7
  42. !$omp simd linear(i:4) linear(b:3) reduction(+:c)
  43. do i = 0, 63, 4
  44. c = c + b - (7 + i / 4 * 3)
  45. call foo (b, i, j, 3)
  46. end do
  47. if (c /= 0 .or. i /= 64 .or. b /= 7 + 16 * 3) call abort
  48. i = 4
  49. j = 4
  50. b = 7
  51. !$omp simd collapse(2) linear(b:2) reduction(+:c)
  52. do i = 0, 7
  53. do j = 0, 7
  54. c = c + b - (7 + 2 * j + 2 * 8 * i)
  55. call foo (b, i, j, 2)
  56. end do
  57. end do
  58. if (c /= 0 .or. i /= 8 .or. j /= 8 .or. b /= 7 + 64 * 2) call abort
  59. i = 4
  60. j = 4
  61. b = 7
  62. !$omp simd collapse(2) linear(b:2) reduction(+:c) lastprivate (i, j)
  63. do i = 0, 7
  64. do j = 0, 7
  65. c = c + b - (7 + 2 * j + 2 * 8 * i)
  66. call foo (b, i, j, 2)
  67. end do
  68. end do
  69. if (c /= 0 .or. i /= 8 .or. j /= 8 .or. b /= 7 + 64 * 2) call abort
  70. i = 4
  71. j = 4
  72. b = 7
  73. !$omp parallel do simd schedule (static, 4) linear(b:2) reduction(+:c)
  74. do i = 0, 63
  75. c = c + b - (7 + 2 * i)
  76. call foo (b, i, j, 2)
  77. end do
  78. if (c /= 0 .or. i /= 64 .or. b /= 7 + 64 * 2) call abort
  79. i = 4
  80. j = 4
  81. b = 7
  82. !$omp parallel do simd schedule (static, 4) linear(b:3) reduction(+:c)
  83. do i = 0, 63, 4
  84. c = c + b - (7 + i / 4 * 3)
  85. call foo (b, i, j, 3)
  86. end do
  87. if (c /= 0 .or. i /= 64 .or. b /= 7 + 16 * 3) call abort
  88. i = 4
  89. j = 4
  90. b = 7
  91. !$omp parallel do simd schedule (static, 4) linear(i) linear(b:2) reduction(+:c)
  92. do i = 0, 63
  93. c = c + b - (7 + 2 * i)
  94. call foo (b, i, j, 2)
  95. end do
  96. if (c /= 0 .or. i /= 64 .or. b /= 7 + 64 * 2) call abort
  97. i = 4
  98. j = 4
  99. b = 7
  100. !$omp parallel do simd schedule (static, 4) linear(i:4) linear(b:3) reduction(+:c)
  101. do i = 0, 63, 4
  102. c = c + b - (7 + i / 4 * 3)
  103. call foo (b, i, j, 3)
  104. end do
  105. if (c /= 0 .or. i /= 64 .or. b /= 7 + 16 * 3) call abort
  106. i = 4
  107. j = 4
  108. b = 7
  109. !$omp parallel do simd schedule (static, 4) collapse(2) linear(b:2) reduction(+:c)
  110. do i = 0, 7
  111. do j = 0, 7
  112. c = c + b - (7 + 2 * j + 2 * 8 * i)
  113. call foo (b, i, j, 2)
  114. end do
  115. end do
  116. if (c /= 0 .or. i /= 8 .or. j /= 8 .or. b /= 7 + 64 * 2) call abort
  117. i = 4
  118. j = 4
  119. b = 7
  120. !$omp parallel do simd schedule (static, 4) collapse(2) linear(b:2) &
  121. !$omp & reduction(+:c) lastprivate (i, j)
  122. do i = 0, 7
  123. do j = 0, 7
  124. c = c + b - (7 + 2 * j + 2 * 8 * i)
  125. call foo (b, i, j, 2)
  126. end do
  127. end do
  128. if (c /= 0 .or. i /= 8 .or. j /= 8 .or. b /= 7 + 64 * 2) call abort
  129. end
  130. subroutine foo (b, i, j, x)
  131. integer, intent (inout) :: b
  132. integer, intent (in) :: i, j, x
  133. b = b + (i - i) + (j - j) + x
  134. end subroutine