doacross-3.c 5.7 KB

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