omp_atomic2.f90 864 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. ! { dg-do run }
  2. real, dimension (20) :: r
  3. integer, dimension (20) :: d
  4. integer :: i, j, k, n
  5. integer (kind = 2) :: a, b, c
  6. do 10 i = 1, 20
  7. r(i) = i
  8. 10 d(i) = 21 - i
  9. n = 20
  10. call foo (r, d, n)
  11. if (n .ne. 22) call abort
  12. if (any (r .ne. 33)) call abort
  13. i = 1
  14. j = 18
  15. k = 23
  16. !$omp atomic
  17. i = min (i, j, k, n)
  18. if (i .ne. 1) call abort
  19. !$omp atomic
  20. i = max (j, n, k, i)
  21. if (i .ne. 23) call abort
  22. a = 1
  23. b = 18
  24. c = 23
  25. !$omp atomic
  26. a = min (a, b, c)
  27. if (a .ne. 1) call abort
  28. !$omp atomic
  29. a = max (a, b, c)
  30. if (a .ne. 23) call abort
  31. contains
  32. function bar (i)
  33. real bar
  34. integer i
  35. bar = 12.0 + i
  36. end function bar
  37. subroutine foo (x, y, n)
  38. integer i, y (*), n
  39. real x (*)
  40. do i = 1, n
  41. !$omp atomic
  42. x(y(i)) = x(y(i)) + bar (i)
  43. end do
  44. !$omp atomic
  45. n = n + 2
  46. end subroutine foo
  47. end