omp_atomic5.f90 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. ! { dg-do run }
  2. integer (kind = 4) :: a, a2
  3. integer (kind = 2) :: b, b2
  4. real :: c
  5. double precision :: d, d2, c2
  6. integer, dimension (10) :: e
  7. e(:) = 5
  8. e(7) = 9
  9. !$omp atomic write seq_cst
  10. a = 1
  11. !$omp atomic seq_cst, write
  12. b = 2
  13. !$omp atomic write, seq_cst
  14. c = 3
  15. !$omp atomic seq_cst write
  16. d = 4
  17. !$omp atomic capture seq_cst
  18. a2 = a
  19. a = a + 4
  20. !$omp end atomic
  21. !$omp atomic capture, seq_cst
  22. b = b - 18
  23. b2 = b
  24. !$omp end atomic
  25. !$omp atomic seq_cst, capture
  26. c2 = c
  27. c = 2.0 * c
  28. !$omp end atomic
  29. !$omp atomic seq_cst capture
  30. d = d / 2.0
  31. d2 = d
  32. !$omp end atomic
  33. if (a2 .ne. 1 .or. b2 .ne. -16 .or. c2 .ne. 3 .or. d2 .ne. 2) call abort
  34. !$omp atomic read seq_cst
  35. a2 = a
  36. !$omp atomic seq_cst, read
  37. c2 = c
  38. if (a2 .ne. 5 .or. b2 .ne. -16 .or. c2 .ne. 6 .or. d2 .ne. 2) call abort
  39. a2 = 10
  40. if (a2 .ne. 10) call abort
  41. !$omp atomic capture
  42. a2 = a
  43. a = e(1) + e(6) + e(7) * 2
  44. !$omp endatomic
  45. if (a2 .ne. 5) call abort
  46. !$omp atomic read
  47. a2 = a
  48. !$omp end atomic
  49. if (a2 .ne. 28) call abort
  50. !$omp atomic capture seq_cst
  51. b2 = b
  52. b = e(1) + e(7) + e(5) * 2
  53. !$omp end atomic
  54. if (b2 .ne. -16) call abort
  55. !$omp atomic seq_cst, read
  56. b2 = b
  57. !$omp end atomic
  58. if (b2 .ne. 24) call abort
  59. end