task-reduction-2.c 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. typedef __SIZE_TYPE__ size_t;
  2. extern void abort (void);
  3. void
  4. bar (int *a, int *b, int *c, int (*d)[2], int (*e)[4], size_t n, int f[1][n], int g[1][n * 2])
  5. {
  6. #pragma omp task in_reduction (*: a[:n], b[3:n], c[n:n], d[0][:n], e[0][1:n], f[0][:], g[0][1:n])
  7. {
  8. a[0] *= 12;
  9. a[1] *= 13;
  10. b[3] *= 14;
  11. b[4] *= 15;
  12. c[n] *= 16;
  13. c[n + 1] *= 17;
  14. d[0][0] *= 18;
  15. d[0][1] *= 19;
  16. e[0][1] *= 20;
  17. e[0][2] *= 21;
  18. f[0][0] *= 22;
  19. f[0][1] *= 23;
  20. g[0][1] *= 24;
  21. g[0][2] *= 25;
  22. }
  23. }
  24. void
  25. baz (size_t n, void *x, void *y, int f[1][n], int g[1][n * 2])
  26. {
  27. int a[n], b[n + 3], c[2 * n];
  28. int (*d)[n] = (int (*)[n]) x;
  29. int (*e)[n * 2] = (int (*)[n * 2]) y;
  30. int i;
  31. for (i = 0; i < n; i++)
  32. {
  33. a[i] = 1;
  34. b[i + 3] = 1;
  35. c[i + n] = 1;
  36. d[0][i] = 1;
  37. e[0][i + 1] = 1;
  38. f[0][i] = 1;
  39. g[0][i + 1] = 1;
  40. }
  41. #pragma omp parallel num_threads(2) firstprivate (n) \
  42. reduction (task, *: a, b[3:n], c[n:n], d[0][:n], e[0][1:n], f[0][:], g[0][1:n])
  43. {
  44. #pragma omp master
  45. bar (a, b, c, (int (*)[2]) d, (int (*)[4]) e, n, f, g);
  46. #pragma omp master
  47. #pragma omp task in_reduction (*: a, b[3:n], c[n:n], d[0][:n], e[0][1:n], f[0][:], g[0][1:n])
  48. {
  49. a[0] *= 2;
  50. a[1] *= 3;
  51. b[3] *= 4;
  52. b[4] *= 5;
  53. c[n] *= 6;
  54. c[n + 1] *= 7;
  55. d[0][0] *= 8;
  56. d[0][1] *= 9;
  57. e[0][1] *= 10;
  58. e[0][2] *= 11;
  59. f[0][0] *= 12;
  60. f[0][1] *= 13;
  61. g[0][1] *= 14;
  62. g[0][2] *= 15;
  63. }
  64. n = 0;
  65. }
  66. if (a[0] != 24 || a[1] != 39 || b[3] != 56 || b[4] != 75)
  67. abort ();
  68. if (c[2] != 96 || c[3] != 119 || d[0][0] != 144 || d[0][1] != 171)
  69. abort ();
  70. if (e[0][1] != 200 || e[0][2] != 231 || f[0][0] != 264 || f[0][1] != 299)
  71. abort ();
  72. if (g[0][1] != 336 || g[0][2] != 375)
  73. abort ();
  74. }
  75. int
  76. main ()
  77. {
  78. int d[1][2], e[1][4], f[1][2], g[1][4];
  79. volatile int two;
  80. two = 2;
  81. baz (two, (void *) d, (void *) e, f, g);
  82. return 0;
  83. }