task-reduction-13.c 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. extern
  2. #ifdef __cplusplus
  3. "C"
  4. #endif
  5. void abort (void);
  6. #pragma omp declare reduction (foo: int: omp_out += omp_in - 1) initializer (omp_priv = 1)
  7. int
  8. main ()
  9. {
  10. int i, v = 0;
  11. unsigned long long j;
  12. volatile unsigned long long sixtyfour = 64;
  13. int a = 0, b = 0, c = 0, d = 0, e = 0, f = 0, g = 0;
  14. #pragma omp parallel
  15. {
  16. #define P(str) _Pragma (#str)
  17. #define ONE_ORDERED_LOOP(var, i, max, n, clauses...) \
  18. P (omp for ordered reduction (task, foo: var) clauses) \
  19. for (i = 0; i < max; i++) \
  20. { \
  21. var++; \
  22. P (omp task in_reduction (foo: var)) \
  23. var++; \
  24. _Pragma ("omp ordered") \
  25. if (v++ != i + n) \
  26. abort (); \
  27. } \
  28. if (var != 128 || v != 64 + n) \
  29. abort (); \
  30. _Pragma ("omp barrier")
  31. ONE_ORDERED_LOOP (a, i, 64, 0, )
  32. ONE_ORDERED_LOOP (b, i, 64, 64, schedule (monotonic: static))
  33. ONE_ORDERED_LOOP (c, i, 64, 128, schedule (static, 1))
  34. ONE_ORDERED_LOOP (d, i, 64, 192, schedule (monotonic: runtime))
  35. ONE_ORDERED_LOOP (e, i, 64, 256, schedule (dynamic, 2))
  36. ONE_ORDERED_LOOP (f, i, 64, 320, schedule (monotonic: guided, 3))
  37. ONE_ORDERED_LOOP (g, i, 64, 384, schedule (auto))
  38. #pragma omp single
  39. { v = 0; a = 0; b = 0; c = 0; d = 0; e = 0; f = 0; g = 0; }
  40. ONE_ORDERED_LOOP (a, j, sixtyfour, 0, )
  41. ONE_ORDERED_LOOP (b, j, sixtyfour, 64, schedule (static))
  42. ONE_ORDERED_LOOP (c, j, sixtyfour, 128, schedule (monotonic: static, 1))
  43. ONE_ORDERED_LOOP (d, j, sixtyfour, 192, schedule (runtime))
  44. ONE_ORDERED_LOOP (e, j, sixtyfour, 256, schedule (monotonic: dynamic, 2))
  45. ONE_ORDERED_LOOP (f, j, sixtyfour, 320, schedule (guided, 3))
  46. ONE_ORDERED_LOOP (g, j, sixtyfour, 384, schedule (monotonic: auto))
  47. }
  48. return 0;
  49. }