cancel-taskgroup-3.c 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. /* { dg-do run { target tls_runtime } } */
  2. /* { dg-set-target-env-var OMP_CANCELLATION "true" } */
  3. #include <stdlib.h>
  4. #include <omp.h>
  5. int t;
  6. #pragma omp threadprivate (t)
  7. int
  8. main ()
  9. {
  10. int a = 0, i;
  11. #pragma omp parallel
  12. #pragma omp taskgroup
  13. {
  14. #pragma omp task
  15. {
  16. #pragma omp cancel taskgroup
  17. if (omp_get_cancellation ())
  18. abort ();
  19. }
  20. #pragma omp taskwait
  21. #pragma omp for reduction (task, +: a)
  22. for (i = 0; i < 64; ++i)
  23. {
  24. a++;
  25. #pragma omp task in_reduction (+: a)
  26. {
  27. volatile int zero = 0;
  28. a += zero;
  29. if (omp_get_cancellation ())
  30. abort ();
  31. }
  32. }
  33. if (a != 64)
  34. abort ();
  35. #pragma omp task
  36. {
  37. if (omp_get_cancellation ())
  38. abort ();
  39. }
  40. }
  41. a = 0;
  42. #pragma omp parallel
  43. #pragma omp taskgroup
  44. {
  45. int p;
  46. #pragma omp for reduction (task, +: a)
  47. for (i = 0; i < 64; ++i)
  48. {
  49. a++;
  50. t = 1;
  51. #pragma omp task in_reduction (+: a)
  52. {
  53. volatile int zero = 0;
  54. a += zero;
  55. #pragma omp cancel taskgroup
  56. if (omp_get_cancellation ())
  57. abort ();
  58. }
  59. }
  60. if (a != 64)
  61. abort ();
  62. p = t;
  63. #pragma omp task firstprivate (p)
  64. {
  65. if (p && omp_get_cancellation ())
  66. abort ();
  67. }
  68. }
  69. return 0;
  70. }