task-reduction-3.c 1002 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. extern void abort (void);
  2. int
  3. foo (void)
  4. {
  5. int i = -1, j = -1, k;
  6. void nested (void) { i++; j++; }
  7. nested ();
  8. #pragma omp taskgroup task_reduction (+: i)
  9. {
  10. #pragma omp task in_reduction (+: i)
  11. i++;
  12. #pragma omp task in_reduction (+: i)
  13. i += 6;
  14. }
  15. #pragma omp taskloop reduction (+: j)
  16. for (k = 0; k < 2; k++)
  17. {
  18. j += 5;
  19. #pragma omp task in_reduction (+: j)
  20. j += 31;
  21. }
  22. return i + j;
  23. }
  24. int
  25. bar (void)
  26. {
  27. int i = 0, j = 0;
  28. void nested (void)
  29. {
  30. int k;
  31. #pragma omp taskgroup task_reduction (+: i)
  32. {
  33. #pragma omp task in_reduction (+: i)
  34. i++;
  35. #pragma omp task in_reduction (+: i)
  36. i += 7;
  37. }
  38. #pragma omp taskloop reduction (+: j)
  39. for (k = 0; k < 2; k++)
  40. {
  41. j += 21;
  42. #pragma omp task in_reduction (+: j)
  43. j += 8;
  44. }
  45. }
  46. nested ();
  47. return i + j;
  48. }
  49. int
  50. main ()
  51. {
  52. if (foo () != (1 + 6 + (5 + 31) * 2))
  53. abort ();
  54. if (bar () != (1 + 7 + (21 + 8) * 2))
  55. abort ();
  56. return 0;
  57. }