target-in-reduction-1.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. void
  2. foo (int x, int *y, int n, int v)
  3. {
  4. int z[3] = { 45, 46, 47 };
  5. int u[n], w[n], i;
  6. for (i = 0; i < n; i++)
  7. w[i] = u[i] = n + i;
  8. #pragma omp taskgroup task_reduction (+: x, y[:2], z[1:2], u, w[1:v])
  9. {
  10. #pragma omp task in_reduction (+: x, y[:2], z[1:2], u, w[1:v])
  11. {
  12. x++;
  13. y[0] += 2;
  14. y[1] += 3;
  15. z[1] += 4;
  16. u[0] += 5;
  17. w[1] += 6;
  18. }
  19. #pragma omp target in_reduction (+: x, y[:2], z[1:2], u, w[1:v])
  20. {
  21. x += 4;
  22. y[0] += 5;
  23. y[1] += 6;
  24. z[2] += 7;
  25. u[1] += 8;
  26. w[2] += 7;
  27. }
  28. #pragma omp target in_reduction (+: x, y[:v], z[1:v], u, w[1:2])
  29. {
  30. x += 9;
  31. y[0] += 10;
  32. y[1] += 11;
  33. z[1] += 12;
  34. u[2] += 13;
  35. w[1] += 14;
  36. }
  37. }
  38. if (x != 56 || y[0] != 60 || y[1] != 64)
  39. __builtin_abort ();
  40. if (z[0] != 45 || z[1] != 62 || z[2] != 54)
  41. __builtin_abort ();
  42. if (u[0] != 8 || u[1] != 12 || u[2] != 18)
  43. __builtin_abort ();
  44. if (w[0] != 3 || w[1] != 24 || w[2] != 12)
  45. __builtin_abort ();
  46. }
  47. void
  48. bar (int x, int *y, int n, int v)
  49. {
  50. int z[3] = { 45, 46, 47 };
  51. int u[n], w[n], i;
  52. for (i = 0; i < n; i++)
  53. w[i] = u[i] = n + i;
  54. #pragma omp parallel master
  55. #pragma omp taskgroup task_reduction (+: x, y[:2], z[1:2], u, w[1:v])
  56. {
  57. #pragma omp task in_reduction (+: x, y[:2], z[1:2], u, w[1:v])
  58. {
  59. x++;
  60. y[0] += 2;
  61. y[1] += 3;
  62. z[1] += 4;
  63. u[0] += 5;
  64. w[1] += 6;
  65. }
  66. #pragma omp target in_reduction (+: x, y[:2], z[1:2], u, w[1:v])
  67. {
  68. x += 4;
  69. y[0] += 5;
  70. y[1] += 6;
  71. z[2] += 7;
  72. u[1] += 8;
  73. w[2] += 7;
  74. }
  75. #pragma omp target in_reduction (+: x, y[:v], z[1:v], u, w[1:2])
  76. {
  77. x += 9;
  78. y[0] += 10;
  79. y[1] += 11;
  80. z[1] += 12;
  81. u[2] += 13;
  82. w[1] += 14;
  83. }
  84. }
  85. if (x != 56 || y[0] != 77 || y[1] != 84)
  86. __builtin_abort ();
  87. if (z[0] != 45 || z[1] != 62 || z[2] != 54)
  88. __builtin_abort ();
  89. if (u[0] != 8 || u[1] != 12 || u[2] != 18)
  90. __builtin_abort ();
  91. if (w[0] != 3 || w[1] != 24 || w[2] != 12)
  92. __builtin_abort ();
  93. }
  94. int
  95. main ()
  96. {
  97. int y[2] = { 43, 44 };
  98. #pragma omp parallel master
  99. foo (42, y, 3, 2);
  100. bar (42, y, 3, 2);
  101. return 0;
  102. }