doacross-1.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. extern void abort (void);
  2. #define N 256
  3. int a[N], b[N / 16][8][4], c[N / 32][8][8];
  4. volatile int d, e;
  5. int
  6. main ()
  7. {
  8. int i, j, k, l, m;
  9. #pragma omp parallel private (l)
  10. {
  11. #pragma omp for schedule(static, 1) ordered (1) nowait
  12. for (i = 0; i < N; i++)
  13. {
  14. #pragma omp atomic write
  15. a[i] = 1;
  16. #pragma omp ordered depend(sink: i - 1)
  17. if (i)
  18. {
  19. #pragma omp atomic read
  20. l = a[i - 1];
  21. if (l < 2)
  22. abort ();
  23. }
  24. #pragma omp atomic write
  25. a[i] = 2;
  26. if (i < N - 1)
  27. {
  28. #pragma omp atomic read
  29. l = a[i + 1];
  30. if (l == 3)
  31. abort ();
  32. }
  33. #pragma omp ordered depend(source)
  34. #pragma omp atomic write
  35. a[i] = 3;
  36. }
  37. #pragma omp for schedule(static) ordered (3) nowait
  38. for (i = 2; i < N / 16 - 1; i++)
  39. for (j = 0; j < 8; j += 2)
  40. for (k = 1; k <= 3; k++)
  41. {
  42. #pragma omp atomic write
  43. b[i][j][k] = 1;
  44. #pragma omp ordered depend(sink: i, j - 2, k - 1) \
  45. depend(sink: i - 2, j - 2, k + 1)
  46. #pragma omp ordered depend(sink: i - 3, j + 2, k - 2)
  47. if (j >= 2 && k > 1)
  48. {
  49. #pragma omp atomic read
  50. l = b[i][j - 2][k - 1];
  51. if (l < 2)
  52. abort ();
  53. }
  54. #pragma omp atomic write
  55. b[i][j][k] = 2;
  56. if (i >= 4 && j >= 2 && k < 3)
  57. {
  58. #pragma omp atomic read
  59. l = b[i - 2][j - 2][k + 1];
  60. if (l < 2)
  61. abort ();
  62. }
  63. if (i >= 5 && j < N / 16 - 3 && k == 3)
  64. {
  65. #pragma omp atomic read
  66. l = b[i - 3][j + 2][k - 2];
  67. if (l < 2)
  68. abort ();
  69. }
  70. #pragma omp ordered depend(source)
  71. #pragma omp atomic write
  72. b[i][j][k] = 3;
  73. }
  74. #define A(n) int n;
  75. #define B(n) A(n##0) A(n##1) A(n##2) A(n##3)
  76. #define C(n) B(n##0) B(n##1) B(n##2) B(n##3)
  77. #define D(n) C(n##0) C(n##1) C(n##2) C(n##3)
  78. D(m)
  79. #undef A
  80. #pragma omp for collapse (2) ordered(61) schedule(dynamic, 15)
  81. for (i = 0; i < N / 32; i++)
  82. for (j = 7; j > 1; j--)
  83. for (k = 6; k >= 0; k -= 2)
  84. #define A(n) for (n = 4; n < 5; n++)
  85. D(m)
  86. #undef A
  87. {
  88. #pragma omp atomic write
  89. c[i][j][k] = 1;
  90. #define A(n) ,n
  91. #define E(n) C(n##0) C(n##1) C(n##2) B(n##30) B(n##31) A(n##320) A(n##321)
  92. #pragma omp ordered depend (sink: i, j, k + 2 E(m)) \
  93. depend (sink:i - 2, j + 1, k - 4 E(m)) \
  94. depend(sink: i - 1, j - 2, k - 2 E(m))
  95. if (k <= 4)
  96. {
  97. #pragma omp atomic read
  98. l = c[i][j][k + 2];
  99. if (l < 2)
  100. abort ();
  101. }
  102. #pragma omp atomic write
  103. c[i][j][k] = 2;
  104. if (i >= 2 && j < 7 && k >= 4)
  105. {
  106. #pragma omp atomic read
  107. l = c[i - 2][j + 1][k - 4];
  108. if (l < 2)
  109. abort ();
  110. }
  111. if (i >= 1 && j >= 4 && k >= 2)
  112. {
  113. #pragma omp atomic read
  114. l = c[i - 1][j - 2][k - 2];
  115. if (l < 2)
  116. abort ();
  117. }
  118. #pragma omp ordered depend (source)
  119. #pragma omp atomic write
  120. c[i][j][k] = 3;
  121. }
  122. #pragma omp for collapse(2) ordered(4) lastprivate (i, j, k)
  123. for (i = 0; i < d + 1; i++)
  124. for (j = d + 1; j >= 0; j--)
  125. for (k = 0; k < d; k++)
  126. for (l = 0; l < d + 2; l++)
  127. {
  128. #pragma omp ordered depend (source)
  129. #pragma omp ordered depend (sink:i - 2, j + 2, k - 2, l)
  130. if (!e)
  131. abort ();
  132. }
  133. #pragma omp single
  134. {
  135. if (i != 1 || j != -1 || k != 0)
  136. abort ();
  137. i = 8; j = 9; k = 10;
  138. }
  139. #pragma omp for collapse(2) ordered(4) lastprivate (i, j, k, m)
  140. for (i = 0; i < d + 1; i++)
  141. for (j = d + 1; j >= 0; j--)
  142. for (k = 0; k < d + 2; k++)
  143. for (m = 0; m < d; m++)
  144. {
  145. #pragma omp ordered depend (source)
  146. #pragma omp ordered depend (sink:i - 2, j + 2, k - 2, m)
  147. abort ();
  148. }
  149. #pragma omp single
  150. if (i != 1 || j != -1 || k != 2 || m != 0)
  151. abort ();
  152. #pragma omp for collapse(2) ordered(4) nowait
  153. for (i = 0; i < d + 1; i++)
  154. for (j = d; j > 0; j--)
  155. for (k = 0; k < d + 2; k++)
  156. for (l = 0; l < d + 4; l++)
  157. {
  158. #pragma omp ordered depend (source)
  159. #pragma omp ordered depend (sink:i - 2, j + 2, k - 2, l)
  160. if (!e)
  161. abort ();
  162. }
  163. #pragma omp for nowait
  164. for (i = 0; i < N; i++)
  165. if (a[i] != 3)
  166. abort ();
  167. #pragma omp for collapse(2) private(k) nowait
  168. for (i = 0; i < N / 16; i++)
  169. for (j = 0; j < 8; j++)
  170. for (k = 0; k < 4; k++)
  171. if (b[i][j][k] != 3 * (i >= 2 && i < N / 16 - 1 && (j & 1) == 0 && k >= 1))
  172. abort ();
  173. #pragma omp for collapse(3) nowait
  174. for (i = 0; i < N / 32; i++)
  175. for (j = 0; j < 8; j++)
  176. for (k = 0; k < 8; k++)
  177. if (c[i][j][k] != 3 * (j >= 2 && (k & 1) == 0))
  178. abort ();
  179. }
  180. return 0;
  181. }