task-reduction-4.c 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. extern
  2. #ifdef __cplusplus
  3. "C"
  4. #endif
  5. void abort (void);
  6. void
  7. bar (long long int *p)
  8. {
  9. p[0] *= 2;
  10. #pragma omp task in_reduction (*: p[0])
  11. p[0] *= 3;
  12. }
  13. void
  14. foo (long long int *p, long long int *q)
  15. {
  16. #pragma omp taskgroup task_reduction (*: p[0])
  17. {
  18. #pragma omp task in_reduction (*: p[0])
  19. bar (p);
  20. #pragma omp task in_reduction (*: p[0])
  21. bar (p);
  22. bar (p);
  23. #pragma omp taskgroup task_reduction (*: q[0])
  24. {
  25. #pragma omp task in_reduction (*: q[0])
  26. bar (q);
  27. #pragma omp task in_reduction (*: q[0])
  28. bar (q);
  29. #pragma omp task in_reduction (*: q[0])
  30. bar (q);
  31. bar (q);
  32. #pragma omp task in_reduction (*: p[0])
  33. {
  34. #pragma omp taskgroup task_reduction (*: p[0])
  35. {
  36. #pragma omp task in_reduction (*: p[0])
  37. bar (p);
  38. p[0] *= 2;
  39. #pragma omp task in_reduction (*: p[0])
  40. bar (p);
  41. }
  42. }
  43. }
  44. }
  45. }
  46. int
  47. main ()
  48. {
  49. long long int p = 1LL, q = 1LL;
  50. foo (&p, &q);
  51. if (p != 6LL * 6LL * 6LL * 6LL * 6LL * 2LL || q != 6LL * 6LL * 6LL * 6LL)
  52. abort ();
  53. p = 1LL;
  54. q = 1LL;
  55. #pragma omp taskgroup
  56. foo (&p, &q);
  57. if (p != 6LL * 6LL * 6LL * 6LL * 6LL * 2LL || q != 6LL * 6LL * 6LL * 6LL)
  58. abort ();
  59. p = 1LL;
  60. q = 1LL;
  61. #pragma omp parallel
  62. #pragma omp single
  63. foo (&p, &q);
  64. if (p != 6LL * 6LL * 6LL * 6LL * 6LL * 2LL || q != 6LL * 6LL * 6LL * 6LL)
  65. abort ();
  66. return 0;
  67. }