allocate-3.c 11 KB

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