taskloop-reduction-3.c 930 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  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. #define N 1024
  7. long int u[N], m, n;
  8. __attribute__((noipa)) void
  9. foo (void)
  10. {
  11. int i;
  12. #pragma omp taskloop simd reduction (+:m) grainsize (64)
  13. for (i = 0; i < N; ++i)
  14. m += u[i];
  15. }
  16. __attribute__((noipa)) void
  17. bar (int x)
  18. {
  19. #pragma omp taskloop simd in_reduction (+:n) grainsize (64) nogroup
  20. for (int i = (x & 1) * (N / 2); i < (x & 1) * (N / 2) + (N / 2); i++)
  21. n += 2 * u[i];
  22. }
  23. int
  24. main ()
  25. {
  26. int i;
  27. for (i = 0; i < N; ++i)
  28. u[i] = i;
  29. #pragma omp parallel master
  30. {
  31. foo ();
  32. #pragma omp taskgroup task_reduction (+:n)
  33. {
  34. bar (0);
  35. bar (1);
  36. }
  37. }
  38. if (m != (long)(N - 1) * (N / 2) || n != (long)(N - 1) * N)
  39. __builtin_abort ();
  40. return 0;
  41. }