ordered-4.c 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. extern
  2. #ifdef __cplusplus
  3. "C"
  4. #endif
  5. void abort (void);
  6. void
  7. foo (int i, char *j)
  8. {
  9. #pragma omp atomic
  10. j[i]++;
  11. #pragma omp ordered threads
  12. {
  13. int t;
  14. #pragma omp atomic read
  15. t = j[i];
  16. if (t != 3)
  17. abort ();
  18. if (i > 1)
  19. {
  20. #pragma omp atomic read
  21. t = j[i - 1];
  22. if (t == 2)
  23. abort ();
  24. }
  25. if (i < 127)
  26. {
  27. #pragma omp atomic read
  28. t = j[i + 1];
  29. if (t == 4)
  30. abort ();
  31. }
  32. }
  33. #pragma omp atomic
  34. j[i]++;
  35. }
  36. int
  37. main ()
  38. {
  39. int i;
  40. char j[128];
  41. #pragma omp parallel
  42. {
  43. #pragma omp for
  44. for (i = 0; i < 128; i++)
  45. j[i] = 0;
  46. #pragma omp for ordered schedule(dynamic, 1)
  47. for (i = 0; i < 128; i++)
  48. {
  49. #pragma omp atomic
  50. j[i]++;
  51. #pragma omp ordered threads
  52. {
  53. int t;
  54. #pragma omp atomic read
  55. t = j[i];
  56. if (t != 1)
  57. abort ();
  58. if (i > 1)
  59. {
  60. #pragma omp atomic read
  61. t = j[i - 1];
  62. if (t == 0)
  63. abort ();
  64. }
  65. if (i < 127)
  66. {
  67. #pragma omp atomic read
  68. t = j[i + 1];
  69. if (t == 2)
  70. abort ();
  71. }
  72. }
  73. #pragma omp atomic
  74. j[i]++;
  75. }
  76. #pragma omp for ordered schedule(static, 1)
  77. for (i = 0; i < 128; i++)
  78. foo (i, j);
  79. }
  80. return 0;
  81. }