reduction-9.C 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. char z[10] = { 0 };
  2. template <int N>
  3. __attribute__((noinline, noclone)) void
  4. foo (int (*&x)[3][N], int *y, long (&w)[1][N])
  5. {
  6. unsigned long long a[9] = {};
  7. short b[5] = {};
  8. #pragma omp parallel for reduction(+:x[0:N][:][0:N], z[:4]) \
  9. reduction(*:y[:3]) reduction(|:a[:4]) \
  10. reduction(&:w[0:][:N]) reduction(max:b)
  11. for (int i = 0; i < 128; i++)
  12. {
  13. x[i / 64][i % 3][(i / 4) & 1] += i;
  14. if ((i & 15) == 1)
  15. y[0] *= 3;
  16. if ((i & 31) == N)
  17. y[1] *= 7;
  18. if ((i & 63) == 3)
  19. y[N] *= 17;
  20. z[i / 32] += (i & 3);
  21. if (i < 4)
  22. z[i] += i;
  23. a[i / 32] |= 1ULL << (i & 30);
  24. w[0][i & 1] &= ~(1L << (i / 17 * 3));
  25. if ((i % 79) > b[0])
  26. b[0] = i % 79;
  27. if ((i % 13) > b[1])
  28. b[1] = i % 13;
  29. if ((i % 23) > b[N])
  30. b[N] = i % 23;
  31. if ((i % 85) > b[3])
  32. b[3] = i % 85;
  33. if ((i % 192) > b[4])
  34. b[4] = i % 192;
  35. }
  36. for (int i = 0; i < 9; i++)
  37. if (a[i] != (i < 4 ? 0x55555555ULL : 0))
  38. __builtin_abort ();
  39. if (b[0] != 78 || b[1] != 12 || b[N] != 22 || b[3] != 84 || b[4] != 127)
  40. __builtin_abort ();
  41. }
  42. int a3[4][3][2];
  43. int (*p3)[3][2] = &a3[1];
  44. int y3[5] = { 0, 1, 1, 1, 0 };
  45. long w3[1][2] = { ~0L, ~0L };
  46. short bb[5];
  47. template <int N>
  48. struct S
  49. {
  50. int (*&x)[3][N];
  51. int *y;
  52. long (&w)[1][N];
  53. char z[10];
  54. short (&b)[5];
  55. unsigned long long a[9];
  56. S() : x(p3), y(y3+1), w(w3), z(), a(), b(bb) {}
  57. __attribute__((noinline, noclone)) void foo ();
  58. };
  59. template <int N>
  60. void
  61. S<N>::foo ()
  62. {
  63. #pragma omp parallel for reduction(+:x[0:N][:][0:N], z[:4]) \
  64. reduction(*:y[:3]) reduction(|:a[:4]) \
  65. reduction(&:w[0:][:N]) reduction(max:b)
  66. for (int i = 0; i < 128; i++)
  67. {
  68. x[i / 64][i % 3][(i / 4) & 1] += i;
  69. if ((i & 15) == 1)
  70. y[0] *= 3;
  71. if ((i & 31) == N)
  72. y[1] *= 7;
  73. if ((i & 63) == 3)
  74. y[N] *= 17;
  75. z[i / 32] += (i & 3);
  76. if (i < 4)
  77. z[i] += i;
  78. a[i / 32] |= 1ULL << (i & 30);
  79. w[0][i & 1] &= ~(1L << (i / 17 * 3));
  80. if ((i % 79) > b[0])
  81. b[0] = i % 79;
  82. if ((i % 13) > b[1])
  83. b[1] = i % 13;
  84. if ((i % 23) > b[N])
  85. b[N] = i % 23;
  86. if ((i % 85) > b[3])
  87. b[3] = i % 85;
  88. if ((i % 192) > b[4])
  89. b[4] = i % 192;
  90. }
  91. }
  92. int
  93. main ()
  94. {
  95. int a[4][3][2] = {};
  96. static int a2[4][3][2] = {{{ 0, 0 }, { 0, 0 }, { 0, 0 }},
  97. {{ 312, 381 }, { 295, 356 }, { 337, 335 }},
  98. {{ 1041, 975 }, { 1016, 1085 }, { 935, 1060 }},
  99. {{ 0, 0 }, { 0, 0 }, { 0, 0 }}};
  100. int (*p)[3][2] = &a[1];
  101. int y[5] = { 0, 1, 1, 1, 0 };
  102. int y2[5] = { 0, 6561, 2401, 289, 0 };
  103. char z2[10] = { 48, 49, 50, 51, 0, 0, 0, 0, 0, 0 };
  104. long w[1][2] = { ~0L, ~0L };
  105. foo<2> (p, y + 1, w);
  106. if (__builtin_memcmp (a, a2, sizeof (a))
  107. || __builtin_memcmp (y, y2, sizeof (y))
  108. || __builtin_memcmp (z, z2, sizeof (z))
  109. || w[0][0] != ~0x249249L
  110. || w[0][1] != ~0x249249L)
  111. __builtin_abort ();
  112. S<2> s;
  113. s.foo ();
  114. for (int i = 0; i < 9; i++)
  115. if (s.a[i] != (i < 4 ? 0x55555555ULL : 0))
  116. __builtin_abort ();
  117. if (__builtin_memcmp (a3, a2, sizeof (a3))
  118. || __builtin_memcmp (y3, y2, sizeof (y3))
  119. || __builtin_memcmp (s.z, z2, sizeof (s.z))
  120. || w3[0][0] != ~0x249249L
  121. || w3[0][1] != ~0x249249L)
  122. __builtin_abort ();
  123. if (bb[0] != 78 || bb[1] != 12 || bb[2] != 22 || bb[3] != 84 || bb[4] != 127)
  124. __builtin_abort ();
  125. }