taskloop-2.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. /* { dg-do run } */
  2. /* { dg-options "-O2" } */
  3. /* { dg-additional-options "-std=c99" { target c } } */
  4. /* { dg-additional-options "-msse2" { target sse2_runtime } } */
  5. /* { dg-additional-options "-mavx" { target avx_runtime } } */
  6. int u[1024], v[1024], w[1024], m;
  7. __attribute__((noinline, noclone)) void
  8. f1 (long a, long b)
  9. {
  10. #pragma omp taskloop simd default(none) shared(u, v, w) nogroup
  11. for (long d = a; d < b; d++)
  12. u[d] = v[d] + w[d];
  13. }
  14. __attribute__((noinline, noclone)) int
  15. f2 (long a, long b, long c)
  16. {
  17. int d, e;
  18. #pragma omp taskloop simd default(none) shared(u, v, w) linear(d:1) linear(c:5) lastprivate(e)
  19. for (d = a; d < b; d++)
  20. {
  21. u[d] = v[d] + w[d];
  22. c = c + 5;
  23. e = c + 9;
  24. }
  25. return d + c + e;
  26. }
  27. __attribute__((noinline, noclone)) int
  28. f3 (long a, long b)
  29. {
  30. int d;
  31. #pragma omp taskloop simd default(none) shared(u, v, w)
  32. for (d = a; d < b; d++)
  33. {
  34. int *p = &d;
  35. u[d] = v[d] + w[d];
  36. }
  37. return d;
  38. }
  39. __attribute__((noinline, noclone)) int
  40. f4 (long a, long b, long c, long d)
  41. {
  42. int e, f, g;
  43. #pragma omp taskloop simd default(none) shared(u, v, w) collapse(2) lastprivate(g)
  44. for (e = a; e < b; e++)
  45. for (f = c; f < d; f++)
  46. {
  47. int *p = &e;
  48. int *q = &f;
  49. int r = 32 * e + f;
  50. u[r] = v[r] + w[r];
  51. g = r;
  52. }
  53. return e + f + g;
  54. }
  55. __attribute__((noinline, noclone)) int
  56. f5 (long a, long b, long c, long d)
  57. {
  58. int e, f;
  59. #pragma omp taskloop simd default(none) shared(u, v, w) collapse(2)
  60. for (e = a; e < b; e++)
  61. for (f = c; f < d; f++)
  62. {
  63. int r = 32 * e + f;
  64. u[r] = v[r] + w[r];
  65. }
  66. return e + f;
  67. }
  68. int
  69. main ()
  70. {
  71. int i;
  72. for (i = 0; i < 1024; i++)
  73. {
  74. v[i] = i;
  75. w[i] = i + 1;
  76. }
  77. #pragma omp parallel
  78. #pragma omp single
  79. f1 (0, 1024);
  80. for (i = 0; i < 1024; i++)
  81. if (u[i] != 2 * i + 1)
  82. __builtin_abort ();
  83. else
  84. {
  85. v[i] = 1024 - i;
  86. w[i] = 512 - i;
  87. }
  88. #pragma omp parallel
  89. #pragma omp single
  90. m = f2 (2, 1022, 17);
  91. for (i = 0; i < 1024; i++)
  92. if ((i < 2 || i >= 1022) ? u[i] != 2 * i + 1 : u[i] != 1536 - 2 * i)
  93. __builtin_abort ();
  94. else
  95. {
  96. v[i] = i;
  97. w[i] = i + 1;
  98. }
  99. if (m != 1022 + 2 * (1020 * 5 + 17) + 9)
  100. __builtin_abort ();
  101. #pragma omp parallel
  102. #pragma omp single
  103. m = f3 (0, 1024);
  104. for (i = 0; i < 1024; i++)
  105. if (u[i] != 2 * i + 1)
  106. __builtin_abort ();
  107. else
  108. {
  109. v[i] = 1024 - i;
  110. w[i] = 512 - i;
  111. }
  112. if (m != 1024)
  113. __builtin_abort ();
  114. #pragma omp parallel
  115. #pragma omp single
  116. m = f4 (0, 32, 0, 32);
  117. for (i = 0; i < 1024; i++)
  118. if (u[i] != 1536 - 2 * i)
  119. __builtin_abort ();
  120. else
  121. {
  122. v[i] = i;
  123. w[i] = i + 1;
  124. }
  125. if (m != 32 + 32 + 1023)
  126. __builtin_abort ();
  127. #pragma omp parallel
  128. #pragma omp single
  129. m = f5 (0, 32, 0, 32);
  130. for (i = 0; i < 1024; i++)
  131. if (u[i] != 2 * i + 1)
  132. __builtin_abort ();
  133. else
  134. {
  135. v[i] = 1024 - i;
  136. w[i] = 512 - i;
  137. }
  138. if (m != 32 + 32)
  139. __builtin_abort ();
  140. return 0;
  141. }