target-in-reduction-2.C 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. struct S { int a, b, c[2]; };
  2. #pragma omp declare reduction (+: S : (omp_out.a += omp_in.a, omp_out.b += omp_in.b)) \
  3. initializer (omp_priv = { 0, 0, { 0, 0 } })
  4. void
  5. foo (S &x, S *&y, int n, int v)
  6. {
  7. S zu[3] = { { 45, 47, {} }, { 46, 48, {} }, { 47, 49, {} } };
  8. S uu[n], wu[n];
  9. S (&z)[3] = zu;
  10. S (&u)[n] = uu;
  11. S (&w)[n] = wu;
  12. int i;
  13. for (i = 0; i < n; i++)
  14. {
  15. w[i].a = u[i].a = n + i;
  16. w[i].b = u[i].b = n - i;
  17. w[i].c[0] = u[i].c[0] = 0;
  18. w[i].c[1] = u[i].c[1] = 0;
  19. }
  20. #pragma omp taskgroup task_reduction (+: x, y[:2], z[1:2], u, w[1:v])
  21. {
  22. #pragma omp task in_reduction (+: x, y[:2], z[1:2], u, w[1:v])
  23. {
  24. x.a++;
  25. x.b++;
  26. y[0].a += 2;
  27. y[0].b += 12;
  28. y[1].a += 3;
  29. y[1].b += 13;
  30. z[1].a += 4;
  31. z[1].b += 14;
  32. u[0].a += 5;
  33. u[0].b += 15;
  34. w[1].a += 6;
  35. w[1].b += 16;
  36. }
  37. #pragma omp target in_reduction (+: x, y[:2], z[1:2], u, w[1:v])
  38. {
  39. x.a += 4;
  40. x.b += 14;
  41. y[0].a += 5;
  42. y[0].b += 15;
  43. y[1].a += 6;
  44. y[1].b += 16;
  45. z[2].a += 7;
  46. z[2].b += 17;
  47. u[1].a += 8;
  48. u[1].b += 18;
  49. w[2].a += 7;
  50. w[2].b += 17;
  51. }
  52. #pragma omp target in_reduction (+: x, y[:v], z[1:v], u, w[1:2])
  53. {
  54. x.a += 9;
  55. x.b += 19;
  56. y[0].a += 10;
  57. y[0].b += 20;
  58. y[1].a += 11;
  59. y[1].b += 21;
  60. z[1].a += 12;
  61. z[1].b += 22;
  62. u[2].a += 13;
  63. u[2].b += 23;
  64. w[1].a += 14;
  65. w[1].b += 24;
  66. }
  67. }
  68. if (x.a != 56 || y[0].a != 60 || y[1].a != 64)
  69. __builtin_abort ();
  70. if (x.b != 86 || y[0].b != 100 || y[1].b != 104)
  71. __builtin_abort ();
  72. if (z[0].a != 45 || z[1].a != 62 || z[2].a != 54)
  73. __builtin_abort ();
  74. if (z[0].b != 47 || z[1].b != 84 || z[2].b != 66)
  75. __builtin_abort ();
  76. if (u[0].a != 8 || u[1].a != 12 || u[2].a != 18)
  77. __builtin_abort ();
  78. if (u[0].b != 18 || u[1].b != 20 || u[2].b != 24)
  79. __builtin_abort ();
  80. if (w[0].a != 3 || w[1].a != 24 || w[2].a != 12)
  81. __builtin_abort ();
  82. if (w[0].b != 3 || w[1].b != 42 || w[2].b != 18)
  83. __builtin_abort ();
  84. }
  85. void
  86. bar (S &x, S *&y, int n, int v)
  87. {
  88. S zu[3] = { { 45, 47, {} }, { 46, 48, {} }, { 47, 49, {} } };
  89. S uu[n], wu[n];
  90. S (&z)[3] = zu;
  91. S (&u)[n] = uu;
  92. S (&w)[n] = wu;
  93. int i;
  94. for (i = 0; i < n; i++)
  95. {
  96. w[i].a = u[i].a = n + i;
  97. w[i].b = u[i].b = n - i;
  98. w[i].c[0] = u[i].c[0] = 0;
  99. w[i].c[1] = u[i].c[1] = 0;
  100. }
  101. #pragma omp parallel master
  102. #pragma omp taskgroup task_reduction (+: x, y[:2], z[1:2], u, w[1:v])
  103. {
  104. #pragma omp task in_reduction (+: x, y[:2], z[1:2], u, w[1:v])
  105. {
  106. x.a++;
  107. x.b++;
  108. y[0].a += 2;
  109. y[0].b += 12;
  110. y[1].a += 3;
  111. y[1].b += 13;
  112. z[1].a += 4;
  113. z[1].b += 14;
  114. u[0].a += 5;
  115. u[0].b += 15;
  116. w[1].a += 6;
  117. w[1].b += 16;
  118. }
  119. #pragma omp target in_reduction (+: x, y[:2], z[1:2], u, w[1:v])
  120. {
  121. x.a += 4;
  122. x.b += 14;
  123. y[0].a += 5;
  124. y[0].b += 15;
  125. y[1].a += 6;
  126. y[1].b += 16;
  127. z[2].a += 7;
  128. z[2].b += 17;
  129. u[1].a += 8;
  130. u[1].b += 18;
  131. w[2].a += 7;
  132. w[2].b += 17;
  133. }
  134. #pragma omp target in_reduction (+: x, y[:v], z[1:v], u, w[1:2])
  135. {
  136. x.a += 9;
  137. x.b += 19;
  138. y[0].a += 10;
  139. y[0].b += 20;
  140. y[1].a += 11;
  141. y[1].b += 21;
  142. z[1].a += 12;
  143. z[1].b += 22;
  144. u[2].a += 13;
  145. u[2].b += 23;
  146. w[1].a += 14;
  147. w[1].b += 24;
  148. }
  149. }
  150. if (x.a != 56 || y[0].a != 77 || y[1].a != 84)
  151. __builtin_abort ();
  152. if (x.b != 86 || y[0].b != 147 || y[1].b != 154)
  153. __builtin_abort ();
  154. if (z[0].a != 45 || z[1].a != 62 || z[2].a != 54)
  155. __builtin_abort ();
  156. if (z[0].b != 47 || z[1].b != 84 || z[2].b != 66)
  157. __builtin_abort ();
  158. if (u[0].a != 8 || u[1].a != 12 || u[2].a != 18)
  159. __builtin_abort ();
  160. if (u[0].b != 18 || u[1].b != 20 || u[2].b != 24)
  161. __builtin_abort ();
  162. if (w[0].a != 3 || w[1].a != 24 || w[2].a != 12)
  163. __builtin_abort ();
  164. if (w[0].b != 3 || w[1].b != 42 || w[2].b != 18)
  165. __builtin_abort ();
  166. }
  167. int
  168. main ()
  169. {
  170. S x = { 42, 52 };
  171. S yu[2] = { { 43, 53 }, { 44, 54 } };
  172. S *y = yu;
  173. #pragma omp parallel master
  174. foo (x, y, 3, 2);
  175. x.a = 42;
  176. x.b = 52;
  177. bar (x, y, 3, 2);
  178. return 0;
  179. }