allocate-1.c 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375
  1. #include <omp.h>
  2. #include <stdlib.h>
  3. #include <stdint.h>
  4. struct S { int a, b; };
  5. void
  6. foo (int x, int *p, int *q, int px, omp_allocator_handle_t h, int fl)
  7. {
  8. int y = 0, r = 0, i, i1, l, l2[4], l3, n = 8;
  9. int i2, j2, n2 = 9, l4;
  10. int i3, j3, n3 = 10, l5;
  11. int i4, j4, n4 = 11, l6;
  12. int i5;
  13. int v[x], w[x];
  14. int r2[4] = { 0, 0, 0, 0 };
  15. int xo = x;
  16. struct S s = { 27, 29 };
  17. for (i = 0; i < 4; i++)
  18. p[i] = 0;
  19. for (i = 0; i < 3; i++)
  20. q[i] = 0;
  21. for (i = 0; i < x; i++)
  22. w[i] = i;
  23. #pragma omp parallel private (y, v) firstprivate (x) allocate (x, y, v)
  24. {
  25. int *volatile p1 = &x;
  26. int *volatile p2 = &y;
  27. if (x != 42)
  28. abort ();
  29. #pragma omp barrier
  30. *p2 = 1;
  31. p1[0]++;
  32. v[0] = 7;
  33. v[41] = 8;
  34. #pragma omp barrier
  35. if (x != 43 || y != 1)
  36. abort ();
  37. if (v[0] != 7 || v[41] != 8)
  38. abort ();
  39. if ((fl & 2) && (((uintptr_t) p1 | (uintptr_t) p2
  40. | (uintptr_t) &v[0]) & 63) != 0)
  41. abort ();
  42. }
  43. x = xo;
  44. #pragma omp teams
  45. #pragma omp parallel private (y) firstprivate (x, w) allocate (h: x, y, w)
  46. {
  47. int *volatile p1 = &x;
  48. int *volatile p2 = &y;
  49. if (x != 42 || w[17] != 17 || w[41] != 41)
  50. abort ();
  51. #pragma omp barrier
  52. *p2 = 1;
  53. p1[0]++;
  54. w[19]++;
  55. #pragma omp barrier
  56. if (x != 43 || y != 1 || w[19] != 20)
  57. abort ();
  58. if ((fl & 1) && (((uintptr_t) p1 | (uintptr_t) p2
  59. | (uintptr_t) &w[0]) & 63) != 0)
  60. abort ();
  61. }
  62. x = xo;
  63. #pragma omp parallel for private (y) firstprivate (x) allocate (h: x, y, r, l, n) reduction(+: r) lastprivate (l) linear (n: 16)
  64. for (i = 0; i < 64; i++)
  65. {
  66. if (x != 42)
  67. abort ();
  68. y = 1;
  69. l = i;
  70. n += y + 15;
  71. r += i;
  72. if ((fl & 1) && (((uintptr_t) &x | (uintptr_t) &y | (uintptr_t) &r
  73. | (uintptr_t) &l | (uintptr_t) &n) & 63) != 0)
  74. abort ();
  75. }
  76. x = xo;
  77. #pragma omp parallel
  78. {
  79. #pragma omp for lastprivate (l2) private (i1) allocate (h: l2, l3, i1) lastprivate (conditional: l3)
  80. for (i1 = 0; i1 < 64; i1++)
  81. {
  82. l2[0] = i1;
  83. l2[1] = i1 + 1;
  84. l2[2] = i1 + 2;
  85. l2[3] = i1 + 3;
  86. if (i1 < 37)
  87. l3 = i1;
  88. if ((fl & 1) && (((uintptr_t) &l2[0] | (uintptr_t) &l3 | (uintptr_t) &i1) & 63) != 0)
  89. abort ();
  90. }
  91. #pragma omp for collapse(2) lastprivate(l4, i2, j2) linear (n2:17) allocate (h: n2, l4, i2, j2)
  92. for (i2 = 3; i2 < 5; i2++)
  93. for (j2 = 17; j2 < 22; j2 += 2)
  94. {
  95. n2 += 17;
  96. l4 = i2 * 31 + j2;
  97. if ((fl & 1) && (((uintptr_t) &l4 | (uintptr_t) &n2
  98. | (uintptr_t) &i2 | (uintptr_t) &j2) & 63) != 0)
  99. abort ();
  100. }
  101. #pragma omp for collapse(2) lastprivate(l5, i3, j3) linear (n3:17) schedule (static, 3) allocate (n3, l5, i3, j3)
  102. for (i3 = 3; i3 < 5; i3++)
  103. for (j3 = 17; j3 < 23; j3 += 2)
  104. {
  105. n3 += 17;
  106. l5 = i3 * 31 + j3;
  107. if ((fl & 2) && (((uintptr_t) &l5 | (uintptr_t) &n3
  108. | (uintptr_t) &i3 | (uintptr_t) &j3) & 63) != 0)
  109. abort ();
  110. }
  111. #pragma omp for collapse(2) lastprivate(l6, i4, j4) linear (n4:17) schedule (dynamic) allocate (h: n4, l6, i4, j4)
  112. for (i4 = 3; i4 < 5; i4++)
  113. for (j4 = 17; j4 < 22; j4 += 2)
  114. {
  115. n4 += 17;
  116. l6 = i4 * 31 + j4;
  117. if ((fl & 1) && (((uintptr_t) &l6 | (uintptr_t) &n4
  118. | (uintptr_t) &i4 | (uintptr_t) &j4) & 63) != 0)
  119. abort ();
  120. }
  121. #pragma omp for lastprivate (i5) allocate (i5)
  122. for (i5 = 1; i5 < 17; i5 += 3)
  123. {
  124. if ((fl & 2) && (((uintptr_t) &i5) & 63) != 0)
  125. abort ();
  126. }
  127. #pragma omp for reduction(+:p[2:px], q[:3], r2) allocate(h: p, q, r2)
  128. for (i = 0; i < 32; i++)
  129. {
  130. p[2] += i;
  131. p[3] += 2 * i;
  132. q[0] += 3 * i;
  133. q[2] += 4 * i;
  134. r2[0] += 5 * i;
  135. r2[3] += 6 * i;
  136. /* Can't really rely on alignment of &p[0], the implementation could
  137. allocate the whole array or do what GCC does and allocate only part
  138. of it. */
  139. if ((fl & 1) && (((uintptr_t) &q[0] | (uintptr_t) &r2[0]) & 63) != 0)
  140. abort ();
  141. }
  142. #pragma omp task private(y) firstprivate(x) allocate(x, y)
  143. {
  144. int *volatile p1 = &x;
  145. int *volatile p2 = &y;
  146. if (x != 42)
  147. abort ();
  148. p1[0]++;
  149. p2[0] = 21;
  150. if (x != 43 || y != 21)
  151. abort ();
  152. if ((fl & 2) && (((uintptr_t) p1 | (uintptr_t) p2) & 63) != 0)
  153. abort ();
  154. }
  155. #pragma omp task private(y) firstprivate(x) allocate(h: x, y)
  156. {
  157. int *volatile p1 = &x;
  158. int *volatile p2 = &y;
  159. if (x != 42)
  160. abort ();
  161. p1[0]++;
  162. p2[0] = 21;
  163. if (x != 43 || y != 21)
  164. abort ();
  165. if ((fl & 1) && (((uintptr_t) p1 | (uintptr_t) p2) & 63) != 0)
  166. abort ();
  167. }
  168. #pragma omp task private(y) firstprivate(s) allocate(s, y)
  169. {
  170. int *volatile p1 = &s.a;
  171. int *volatile p2 = &s.b;
  172. int *volatile p3 = &y;
  173. if (s.a != 27 || s.b != 29)
  174. abort ();
  175. p1[0]++;
  176. p2[0]++;
  177. p3[0] = 21;
  178. if (s.a != 28 || s.b != 30 || y != 21)
  179. abort ();
  180. if ((fl & 2) && (((uintptr_t) p1 | (uintptr_t) p3) & 63) != 0)
  181. abort ();
  182. }
  183. #pragma omp task private(y) firstprivate(s) allocate(h: s, y)
  184. {
  185. int *volatile p1 = &s.a;
  186. int *volatile p2 = &s.b;
  187. int *volatile p3 = &y;
  188. if (s.a != 27 || s.b != 29)
  189. abort ();
  190. p1[0]++;
  191. p2[0]++;
  192. p3[0] = 21;
  193. if (s.a != 28 || s.b != 30 || y != 21)
  194. abort ();
  195. if ((fl & 1) && (((uintptr_t) p1 | (uintptr_t) p3) & 63) != 0)
  196. abort ();
  197. }
  198. }
  199. if (r != 64 * 63 / 2 || l != 63 || n != 8 + 16 * 64)
  200. abort ();
  201. if (l2[0] != 63 || l2[1] != 63 + 1 || l2[2] != 63 + 2 || l2[3] != 63 + 3 || l3 != 36)
  202. abort ();
  203. if (i2 != 5 || j2 != 23 || n2 != 9 + 6 * 17 || l4 != 4 * 31 + 21)
  204. abort ();
  205. if (i3 != 5 || j3 != 23 || n3 != 10 + 6 * 17 || l5 != 4 * 31 + 21)
  206. abort ();
  207. if (i4 != 5 || j4 != 23 || n4 != 11 + 6 * 17 || l6 != 4 * 31 + 21)
  208. abort ();
  209. if (i5 != 19)
  210. abort ();
  211. if (p[2] != (32 * 31) / 2 || p[3] != 2 * (32 * 31) / 2
  212. || q[0] != 3 * (32 * 31) / 2 || q[2] != 4 * (32 * 31) / 2
  213. || r2[0] != 5 * (32 * 31) / 2 || r2[3] != 6 * (32 * 31) / 2)
  214. abort ();
  215. }
  216. void
  217. bar (int x, omp_allocator_handle_t h)
  218. {
  219. int y = 0, r = 0, i, i1, l, l2[4], l3, n = 8;
  220. int i2, j2, n2 = 9, l4;
  221. int i3, j3, n3 = 10, l5;
  222. int i4, j4, n4 = 11, l6;
  223. int i5;
  224. struct S s = { 27, 29 };
  225. int xo = x;
  226. #pragma omp parallel private (y) firstprivate (x) allocate (x, y)
  227. {
  228. if (x != 42)
  229. abort ();
  230. #pragma omp barrier
  231. y = 1;
  232. x++;
  233. #pragma omp barrier
  234. if (x != 43 || y != 1)
  235. abort ();
  236. }
  237. x = xo;
  238. #pragma omp teams
  239. #pragma omp parallel private (y) firstprivate (x) allocate (h: x, y)
  240. {
  241. if (x != 42)
  242. abort ();
  243. #pragma omp barrier
  244. y = 1;
  245. x++;
  246. #pragma omp barrier
  247. if (x != 43 || y != 1)
  248. abort ();
  249. }
  250. x = xo;
  251. #pragma omp parallel for private (y) firstprivate (x) allocate (h: x, y, r, l, n) reduction(+: r) lastprivate (l) linear (n: 16)
  252. for (i = 0; i < 64; i++)
  253. {
  254. if (x != 42)
  255. abort ();
  256. y = 1;
  257. l = i;
  258. n += y + 15;
  259. r += i;
  260. }
  261. x = xo;
  262. #pragma omp parallel
  263. {
  264. #pragma omp for lastprivate (l2) private (i1) allocate (h: l2, l3, i1) lastprivate (conditional: l3)
  265. for (i1 = 0; i1 < 64; i1++)
  266. {
  267. l2[0] = i1;
  268. l2[1] = i1 + 1;
  269. l2[2] = i1 + 2;
  270. l2[3] = i1 + 3;
  271. if (i1 < 37)
  272. l3 = i1;
  273. }
  274. #pragma omp for collapse(2) lastprivate(l4, i2, j2) linear (n2:17) allocate (h: n2, l4, i2, j2)
  275. for (i2 = 3; i2 < 5; i2++)
  276. for (j2 = 17; j2 < 22; j2 += 2)
  277. {
  278. n2 += 17;
  279. l4 = i2 * 31 + j2;
  280. }
  281. #pragma omp for collapse(2) lastprivate(l5, i3, j3) linear (n3:17) schedule (static, 3) allocate (n3, l5, i3, j3)
  282. for (i3 = 3; i3 < 5; i3++)
  283. for (j3 = 17; j3 < 23; j3 += 2)
  284. {
  285. n3 += 17;
  286. l5 = i3 * 31 + j3;
  287. }
  288. #pragma omp for collapse(2) lastprivate(l6, i4, j4) linear (n4:17) schedule (dynamic) allocate (h: n4, l6, i4, j4)
  289. for (i4 = 3; i4 < 5; i4++)
  290. for (j4 = 17; j4 < 22; j4 += 2)
  291. {
  292. n4 += 17;
  293. l6 = i4 * 31 + j4;
  294. }
  295. #pragma omp for lastprivate (i5) allocate (i5)
  296. for (i5 = 1; i5 < 17; i5 += 3)
  297. ;
  298. #pragma omp task private(y) firstprivate(x) allocate(x, y)
  299. {
  300. if (x != 42)
  301. abort ();
  302. x++;
  303. y = 21;
  304. if (x != 43 || y != 21)
  305. abort ();
  306. }
  307. #pragma omp task private(y) firstprivate(x) allocate(h: x, y)
  308. {
  309. if (x != 42)
  310. abort ();
  311. x++;
  312. y = 21;
  313. if (x != 43 || y != 21)
  314. abort ();
  315. }
  316. #pragma omp task private(y) firstprivate(s) allocate(s, y)
  317. {
  318. if (s.a != 27 || s.b != 29)
  319. abort ();
  320. s.a++;
  321. s.b++;
  322. y = 21;
  323. if (s.a != 28 || s.b != 30 || y != 21)
  324. abort ();
  325. }
  326. #pragma omp task private(y) firstprivate(s) allocate(h: s, y)
  327. {
  328. if (s.a != 27 || s.b != 29)
  329. abort ();
  330. s.a++;
  331. s.b++;
  332. y = 21;
  333. if (s.a != 28 || s.b != 30 || y != 21)
  334. abort ();
  335. }
  336. }
  337. if (r != 64 * 63 / 2 || l != 63 || n != 8 + 16 * 64)
  338. abort ();
  339. if (l2[0] != 63 || l2[1] != 63 + 1 || l2[2] != 63 + 2 || l2[3] != 63 + 3 || l3 != 36)
  340. abort ();
  341. if (i2 != 5 || j2 != 23 || n2 != 9 + 6 * 17 || l4 != 4 * 31 + 21)
  342. abort ();
  343. if (i3 != 5 || j3 != 23 || n3 != 10 + 6 * 17 || l5 != 4 * 31 + 21)
  344. abort ();
  345. if (i4 != 5 || j4 != 23 || n4 != 11 + 6 * 17 || l6 != 4 * 31 + 21)
  346. abort ();
  347. if (i5 != 19)
  348. abort ();
  349. }
  350. int
  351. main ()
  352. {
  353. omp_alloctrait_t traits[3]
  354. = { { omp_atk_alignment, 64 },
  355. { omp_atk_fallback, omp_atv_null_fb } };
  356. omp_allocator_handle_t a
  357. = omp_init_allocator (omp_default_mem_space, 2, traits);
  358. int p[4], q[3];
  359. if (a == omp_null_allocator)
  360. abort ();
  361. omp_set_default_allocator (omp_default_mem_alloc);
  362. foo (42, p, q, 2, omp_null_allocator, 0);
  363. foo (42, p, q, 2, omp_default_mem_alloc, 0);
  364. foo (42, p, q, 2, a, 1);
  365. omp_set_default_allocator (a);
  366. foo (42, p, q, 2, omp_null_allocator, 3);
  367. foo (42, p, q, 2, omp_default_mem_alloc, 2);
  368. bar (42, a);
  369. omp_destroy_allocator (a);
  370. return 0;
  371. }