taskloop-reduction-2.C 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253
  1. extern "C" void abort ();
  2. int as[2];
  3. int (&a)[2] = as;
  4. long long int bs[7] = { 9, 11, 1, 1, 1, 13, 15 };
  5. long long int (&b)[7] = bs;
  6. int es[3] = { 5, 0, 5 };
  7. int (&e)[3] = es;
  8. int fs[5] = { 6, 7, 0, 0, 9 };
  9. int (&f)[5] = fs;
  10. int gs[4] = { 1, 0, 0, 2 };
  11. int (&g)[4] = gs;
  12. int hs[3] = { 0, 1, 4 };
  13. int (&h)[3] = hs;
  14. int ks[4][2] = { { 5, 6 }, { 0, 0 }, { 0, 0 }, { 7, 8 } };
  15. int (&k)[4][2] = ks;
  16. long long *ss;
  17. long long *&s = ss;
  18. long long (*ts)[2];
  19. long long (*&t)[2] = ts;
  20. struct U { U (); ~U () {}; U (const U &); int u[4]; };
  21. U::U
  22. ()
  23. {
  24. u[0] = 0; u[1] = 1; u[2] = 2; u[3] = 3;
  25. }
  26. U::U
  27. (const U &r)
  28. {
  29. u[0] = r.u[0]; u[1] = r.u[1]; u[2] = r.u[2]; u[3] = r.u[3];
  30. }
  31. void
  32. foo (int &n, int *&c, long long int *&d, int (&m)[3], int *&r, int (&o)[4], int *&p, int (&q)[4][2])
  33. {
  34. int i;
  35. U u;
  36. u.u[2] = 8;
  37. #pragma omp taskloop in_reduction (+: a, c[:2]) in_reduction (*: b[2 * n:3 * n], d[0:2]) \
  38. in_reduction (+: o[n:n*2], m[1], k[1:2][:], p[0], f[2:2]) \
  39. in_reduction (+: q[1:2][:], g[n:n*2], e[1], h[0], r[2:2]) \
  40. in_reduction (*: s[1:2], t[2:2][:]) firstprivate (u) nogroup
  41. for (i = 0; i < 2; i++)
  42. {
  43. a[0] += 7;
  44. a[1] += 17;
  45. b[2] *= 2;
  46. b[4] *= 2;
  47. c[0] += 6;
  48. d[1] *= 2;
  49. e[1] += 19;
  50. f[2] += 21;
  51. f[3] += 23;
  52. g[1] += 25;
  53. g[2] += 27;
  54. h[0] += 29;
  55. k[1][0] += 31;
  56. k[2][1] += 33;
  57. m[1] += 19;
  58. r[2] += 21;
  59. r[3] += 23;
  60. o[1] += 25;
  61. o[2] += 27;
  62. p[0] += 29;
  63. q[1][0] += 31;
  64. q[2][1] += 33;
  65. s[1] *= 2;
  66. t[2][0] *= 2;
  67. t[3][1] *= 2;
  68. if (u.u[2] != 8)
  69. abort ();
  70. }
  71. }
  72. void
  73. test (int &n)
  74. {
  75. int cs[2] = { 0, 0 };
  76. int (&c)[2] = cs;
  77. int ps[3] = { 0, 1, 4 };
  78. int (&p)[3] = ps;
  79. int qs[4][2] = { { 5, 6 }, { 0, 0 }, { 0, 0 }, { 7, 8 } };
  80. int (&q)[4][2] = qs;
  81. long long sb[4] = { 5, 1, 1, 6 };
  82. long long tb[5][2] = { { 9, 10 }, { 11, 12 }, { 1, 1 }, { 1, 1 }, { 13, 14 } };
  83. int ms[3] = { 5, 0, 5 };
  84. int os[4] = { 1, 0, 0, 2 };
  85. s = sb;
  86. t = tb;
  87. U u;
  88. u.u[2] = 10;
  89. #pragma omp parallel
  90. #pragma omp single
  91. {
  92. long long int ds[] = { 1, 1 };
  93. long long int (&d)[2] = ds;
  94. int (&m)[3] = ms;
  95. int rs[5] = { 6, 7, 0, 0, 9 };
  96. int (&r)[5] = rs;
  97. int (&o)[4] = os;
  98. int i;
  99. #pragma omp taskloop reduction (+: a, c) reduction (*: b[2 * n:3 * n], d) \
  100. reduction (+: e[1], f[2:2], g[n:n*2], h[0], k[1:2][0:2]) \
  101. reduction (+: o[n:n*2], m[1], q[1:2][:], p[0], r[2:2]) \
  102. reduction (*: t[2:2][:], s[1:n + 1]) firstprivate (u)
  103. for (i = 0; i < 4; i++)
  104. {
  105. int j;
  106. a[0] += 2;
  107. a[1] += 3;
  108. b[2] *= 2;
  109. f[3] += 8;
  110. g[1] += 9;
  111. g[2] += 10;
  112. h[0] += 11;
  113. k[1][1] += 13;
  114. k[2][1] += 15;
  115. m[1] += 16;
  116. r[2] += 8;
  117. s[1] *= 2;
  118. t[2][1] *= 2;
  119. t[3][1] *= 2;
  120. if (u.u[2] != 10)
  121. abort ();
  122. for (j = 0; j < 2; j++)
  123. #pragma omp task in_reduction (+: a, c[:2]) \
  124. in_reduction (*: b[2 * n:3 * n], d[n - 1:n + 1]) \
  125. in_reduction (+: e[1], f[2:2], g[n:n*2], h[0], k[1:2][:2]) \
  126. in_reduction (+: m[1], r[2:2], o[n:n*2], p[0], q[1:2][:2]) \
  127. in_reduction (*: s[n:2], t[2:2][:]) firstprivate (u)
  128. {
  129. m[1] += 6;
  130. r[2] += 7;
  131. q[1][0] += 17;
  132. q[2][0] += 19;
  133. a[0] += 4;
  134. a[1] += 5;
  135. b[3] *= 2;
  136. b[4] *= 2;
  137. f[3] += 18;
  138. g[1] += 29;
  139. g[2] += 18;
  140. h[0] += 19;
  141. s[2] *= 2;
  142. t[2][0] *= 2;
  143. t[3][0] *= 2;
  144. int *cp = c;
  145. long long int *dp = d;
  146. int *rp = r;
  147. int *pp = p;
  148. foo (n, cp, dp, m, rp, o, pp, q);
  149. if (u.u[2] != 10)
  150. abort ();
  151. r[3] += 18;
  152. o[1] += 29;
  153. o[2] += 18;
  154. p[0] += 19;
  155. c[0] += 4;
  156. c[1] += 5;
  157. d[0] *= 2;
  158. e[1] += 6;
  159. f[2] += 7;
  160. k[1][0] += 17;
  161. k[2][0] += 19;
  162. }
  163. r[3] += 8;
  164. o[1] += 9;
  165. o[2] += 10;
  166. p[0] += 11;
  167. q[1][1] += 13;
  168. q[2][1] += 15;
  169. b[3] *= 2;
  170. c[0] += 4;
  171. c[1] += 9;
  172. d[0] *= 2;
  173. e[1] += 16;
  174. f[2] += 8;
  175. }
  176. if (d[0] != 1LL << (8 + 4)
  177. || d[1] != 1LL << 16
  178. || m[0] != 5
  179. || m[1] != 19 * 16 + 6 * 8 + 16 * 4
  180. || m[2] != 5
  181. || r[0] != 6
  182. || r[1] != 7
  183. || r[2] != 21 * 16 + 7 * 8 + 8 * 4
  184. || r[3] != 23 * 16 + 18 * 8 + 8 * 4
  185. || r[4] != 9
  186. || o[0] != 1
  187. || o[1] != 25 * 16 + 29 * 8 + 9 * 4
  188. || o[2] != 27 * 16 + 18 * 8 + 10 * 4
  189. || o[3] != 2)
  190. abort ();
  191. }
  192. if (a[0] != 7 * 16 + 4 * 8 + 2 * 4
  193. || a[1] != 17 * 16 + 5 * 8 + 3 * 4
  194. || b[0] != 9 || b[1] != 11
  195. || b[2] != 1LL << (16 + 4)
  196. || b[3] != 1LL << (8 + 4)
  197. || b[4] != 1LL << (16 + 8)
  198. || b[5] != 13 || b[6] != 15
  199. || c[0] != 6 * 16 + 4 * 8 + 4 * 4
  200. || c[1] != 5 * 8 + 9 * 4
  201. || e[0] != 5
  202. || e[1] != 19 * 16 + 6 * 8 + 16 * 4
  203. || e[2] != 5
  204. || f[0] != 6
  205. || f[1] != 7
  206. || f[2] != 21 * 16 + 7 * 8 + 8 * 4
  207. || f[3] != 23 * 16 + 18 * 8 + 8 * 4
  208. || f[4] != 9
  209. || g[0] != 1
  210. || g[1] != 25 * 16 + 29 * 8 + 9 * 4
  211. || g[2] != 27 * 16 + 18 * 8 + 10 * 4
  212. || g[3] != 2
  213. || h[0] != 29 * 16 + 19 * 8 + 11 * 4
  214. || h[1] != 1 || h[2] != 4
  215. || k[0][0] != 5 || k[0][1] != 6
  216. || k[1][0] != 31 * 16 + 17 * 8
  217. || k[1][1] != 13 * 4
  218. || k[2][0] != 19 * 8
  219. || k[2][1] != 33 * 16 + 15 * 4
  220. || k[3][0] != 7 || k[3][1] != 8
  221. || p[0] != 29 * 16 + 19 * 8 + 11 * 4
  222. || p[1] != 1 || p[2] != 4
  223. || q[0][0] != 5 || q[0][1] != 6
  224. || q[1][0] != 31 * 16 + 17 * 8
  225. || q[1][1] != 13 * 4
  226. || q[2][0] != 19 * 8
  227. || q[2][1] != 33 * 16 + 15 * 4
  228. || q[3][0] != 7 || q[3][1] != 8
  229. || sb[0] != 5
  230. || sb[1] != 1LL << (16 + 4)
  231. || sb[2] != 1LL << 8
  232. || sb[3] != 6
  233. || tb[0][0] != 9 || tb[0][1] != 10 || tb[1][0] != 11 || tb[1][1] != 12
  234. || tb[2][0] != 1LL << (16 + 8)
  235. || tb[2][1] != 1LL << 4
  236. || tb[3][0] != 1LL << 8
  237. || tb[3][1] != 1LL << (16 + 4)
  238. || tb[4][0] != 13 || tb[4][1] != 14)
  239. abort ();
  240. }
  241. int
  242. main ()
  243. {
  244. int n = 1;
  245. test (n);
  246. return 0;
  247. }