target-31.c 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. #include <omp.h>
  2. #include <stdlib.h>
  3. int a = 1, b = 2, c = 3, d = 4;
  4. int e[2] = { 5, 6 }, f[2] = { 7, 8 }, g[2] = { 9, 10 }, h[2] = { 11, 12 };
  5. __attribute__((noinline, noclone)) void
  6. use (int *k, int *l, int *m, int *n, int *o, int *p, int *q, int *r)
  7. {
  8. asm volatile ("" : : "r" (k) : "memory");
  9. asm volatile ("" : : "r" (l) : "memory");
  10. asm volatile ("" : : "r" (m) : "memory");
  11. asm volatile ("" : : "r" (n) : "memory");
  12. asm volatile ("" : : "r" (o) : "memory");
  13. asm volatile ("" : : "r" (p) : "memory");
  14. asm volatile ("" : : "r" (q) : "memory");
  15. asm volatile ("" : : "r" (r) : "memory");
  16. }
  17. #pragma omp declare target to (use)
  18. int
  19. main ()
  20. {
  21. int err = 0, r = -1, t[4];
  22. long s[4] = { -1, -2, -3, -4 };
  23. int j = 13, k = 14, l[2] = { 15, 16 }, m[2] = { 17, 18 };
  24. #pragma omp target private (a, b, e, f) firstprivate (c, d, g, h) map(from: r, s, t) \
  25. map(tofrom: err, j, l) map(to: k, m)
  26. #pragma omp teams num_teams (4) thread_limit (8) private (b, f) firstprivate (d, h, k, m)
  27. {
  28. int u1 = k, u2[2] = { m[0], m[1] };
  29. int u3[64];
  30. int i;
  31. for (i = 0; i < 64; i++)
  32. u3[i] = k + i;
  33. #pragma omp parallel num_threads (1)
  34. {
  35. int v1, v2, v3;
  36. #pragma omp atomic read
  37. v1 = c;
  38. #pragma omp atomic read
  39. v2 = g[0];
  40. #pragma omp atomic read
  41. v3 = g[1];
  42. if ((v1 < 3 || v1 > 6)
  43. || d != 4
  44. || (v2 < 9 || v2 > 15 || (v2 & 1) == 0)
  45. || (v3 < 10 || v3 > 19 || ((v3 - 10) % 3) != 0)
  46. || h[0] != 11 || h[1] != 12 || k != 14 || m[0] != 17 || m[1] != 18)
  47. #pragma omp atomic write
  48. err = 1;
  49. b = omp_get_team_num ();
  50. if (b >= 4)
  51. #pragma omp atomic write
  52. err = 1;
  53. if (b == 0)
  54. {
  55. a = omp_get_num_teams ();
  56. e[0] = 2 * a;
  57. e[1] = 3 * a;
  58. }
  59. f[0] = 2 * b;
  60. f[1] = 3 * b;
  61. #pragma omp atomic update
  62. c++;
  63. #pragma omp atomic update
  64. g[0] += 2;
  65. #pragma omp atomic update
  66. g[1] += 3;
  67. d++;
  68. h[0] += 2;
  69. h[1] += 3;
  70. k += b;
  71. m[0] += 2 * b;
  72. m[1] += 3 * b;
  73. }
  74. use (&a, &b, &c, &d, e, f, g, h);
  75. #pragma omp parallel firstprivate (u1, u2)
  76. {
  77. int w = omp_get_thread_num ();
  78. int x = 19;
  79. int y[2] = { 20, 21 };
  80. int v = 24;
  81. int ll[64];
  82. if (u1 != 14 || u2[0] != 17 || u2[1] != 18)
  83. #pragma omp atomic write
  84. err = 1;
  85. u1 += w;
  86. u2[0] += 2 * w;
  87. u2[1] += 3 * w;
  88. use (&u1, u2, &t[b], l, &k, m, &j, h);
  89. #pragma omp master
  90. t[b] = omp_get_num_threads ();
  91. #pragma omp atomic update
  92. j++;
  93. #pragma omp atomic update
  94. l[0] += 2;
  95. #pragma omp atomic update
  96. l[1] += 3;
  97. #pragma omp atomic update
  98. k += 4;
  99. #pragma omp atomic update
  100. m[0] += 5;
  101. #pragma omp atomic update
  102. m[1] += 6;
  103. x += w;
  104. y[0] += 2 * w;
  105. y[1] += 3 * w;
  106. #pragma omp simd safelen(32) private (v)
  107. for (i = 0; i < 64; i++)
  108. {
  109. v = 3 * i;
  110. ll[i] = u1 + v * u2[0] + u2[1] + x + y[0] + y[1] + v + h[0] + u3[i];
  111. }
  112. #pragma omp barrier
  113. use (&u1, u2, &t[b], l, &k, m, &x, y);
  114. if (w < 0 || w > 8 || w != omp_get_thread_num () || u1 != 14 + w
  115. || u2[0] != 17 + 2 * w || u2[1] != 18 + 3 * w
  116. || x != 19 + w || y[0] != 20 + 2 * w || y[1] != 21 + 3 * w
  117. || v != 24)
  118. #pragma omp atomic write
  119. err = 1;
  120. for (i = 0; i < 64; i++)
  121. if (ll[i] != u1 + 3 * i * u2[0] + u2[1] + x + y[0] + y[1] + 3 * i + 13 + 14 + i)
  122. #pragma omp atomic write
  123. err = 1;
  124. }
  125. #pragma omp parallel num_threads (1)
  126. {
  127. if (b == 0)
  128. {
  129. r = a;
  130. if (a != omp_get_num_teams ()
  131. || e[0] != 2 * a
  132. || e[1] != 3 * a)
  133. #pragma omp atomic write
  134. err = 1;
  135. }
  136. int v1, v2, v3;
  137. #pragma omp atomic read
  138. v1 = c;
  139. #pragma omp atomic read
  140. v2 = g[0];
  141. #pragma omp atomic read
  142. v3 = g[1];
  143. s[b] = v1 * 65536L + v2 * 256L + v3;
  144. if (d != 5 || h[0] != 13 || h[1] != 15
  145. || k != 14 + b + 4 * t[b]
  146. || m[0] != 17 + 2 * b + 5 * t[b]
  147. || m[1] != 18 + 3 * b + 6 * t[b]
  148. || b != omp_get_team_num ()
  149. || f[0] != 2 * b || f[1] != 3 * b)
  150. #pragma omp atomic write
  151. err = 1;
  152. }
  153. }
  154. if (err != 0) abort ();
  155. if (r < 1 || r > 4) abort ();
  156. if (a != 1 || b != 2 || c != 3 || d != 4) abort ();
  157. if (e[0] != 5 || e[1] != 6 || f[0] != 7 || f[1] != 8) abort ();
  158. if (g[0] != 9 || g[1] != 10 || h[0] != 11 || h[1] != 12) abort ();
  159. int i, cnt = 0;
  160. for (i = 0; i < r; i++)
  161. if ((s[i] >> 16) < 3 + 1 || (s[i] >> 16) > 3 + 4
  162. || ((s[i] >> 8) & 0xff) < 9 + 2 * 1 || ((s[i] >> 8) & 0xff) > 9 + 2 * 4
  163. || (s[i] & 0xff) < 10 + 3 * 1 || (s[i] & 0xff) > 10 + 3 * 4
  164. || t[i] < 1 || t[i] > 8)
  165. abort ();
  166. else
  167. cnt += t[i];
  168. if (j != 13 + cnt || l[0] != 15 + 2 * cnt || l[1] != 16 + 3 * cnt) abort ();
  169. return 0;
  170. }