cancel-for-2.C 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. // { dg-do run }
  2. // { dg-set-target-env-var OMP_CANCELLATION "true" }
  3. #include <omp.h>
  4. #include "cancel-test.h"
  5. __attribute__((noinline, noclone)) int
  6. foo (int *x)
  7. {
  8. S a, b, c, d, e;
  9. int v = 0, w = 0;
  10. #pragma omp parallel num_threads (32) shared (v, w) private (c, d) firstprivate (e)
  11. {
  12. S g;
  13. int i;
  14. c.bump ();
  15. e.bump ();
  16. #pragma omp for private (d, g) firstprivate (b)
  17. for (i = 0; i < 1000; ++i)
  18. {
  19. b.bump ();
  20. d.bump ();
  21. g.bump ();
  22. #pragma omp cancel for if (x[0])
  23. abort ();
  24. }
  25. #pragma omp for private (d, g) firstprivate (b)
  26. for (i = 0; i < 1000; ++i)
  27. {
  28. b.bump ();
  29. d.bump ();
  30. g.bump ();
  31. #pragma omp cancel for if (x[1])
  32. #pragma omp atomic
  33. v++;
  34. }
  35. #pragma omp for private (d, g) firstprivate (b)
  36. for (i = 0; i < 1000; ++i)
  37. {
  38. b.bump ();
  39. d.bump ();
  40. g.bump ();
  41. #pragma omp cancel for if (x[2])
  42. #pragma omp atomic
  43. w += 8;
  44. }
  45. #pragma omp for private (d, g) firstprivate (b)
  46. for (i = 0; i < 1000; ++i)
  47. {
  48. b.bump ();
  49. d.bump ();
  50. g.bump ();
  51. #pragma omp cancel for if (x[3])
  52. #pragma omp atomic
  53. v += 2;
  54. }
  55. }
  56. if (v != 3000 || w != 0)
  57. abort ();
  58. #pragma omp parallel num_threads (32) shared (v, w) private (c, d) firstprivate (e)
  59. {
  60. S g, h;
  61. int i;
  62. c.bump ();
  63. e.bump ();
  64. /* None of these cancel directives should actually cancel anything,
  65. but the compiler shouldn't know that and thus should use cancellable
  66. barriers at the end of all the workshares. */
  67. #pragma omp cancel parallel if (omp_get_thread_num () == 1 && x[4])
  68. #pragma omp for private (d, g) firstprivate (b)
  69. for (i = 0; i < 1000; ++i)
  70. {
  71. b.bump ();
  72. d.bump ();
  73. g.bump ();
  74. #pragma omp cancel for if (x[0])
  75. abort ();
  76. }
  77. #pragma omp cancel parallel if (omp_get_thread_num () == 2 && x[4])
  78. #pragma omp for private (d, g) firstprivate (b)
  79. for (i = 0; i < 1000; ++i)
  80. {
  81. b.bump ();
  82. d.bump ();
  83. g.bump ();
  84. #pragma omp cancel for if (x[1])
  85. #pragma omp atomic
  86. v++;
  87. }
  88. #pragma omp cancel parallel if (omp_get_thread_num () == 3 && x[4])
  89. #pragma omp for private (d, g) firstprivate (b)
  90. for (i = 0; i < 1000; ++i)
  91. {
  92. b.bump ();
  93. d.bump ();
  94. g.bump ();
  95. #pragma omp cancel for if (x[2])
  96. #pragma omp atomic
  97. w += 8;
  98. }
  99. #pragma omp cancel parallel if (omp_get_thread_num () == 4 && x[4])
  100. #pragma omp for private (d, g) firstprivate (b)
  101. for (i = 0; i < 1000; ++i)
  102. {
  103. b.bump ();
  104. d.bump ();
  105. g.bump ();
  106. #pragma omp cancel for if (x[3])
  107. #pragma omp atomic
  108. v += 2;
  109. }
  110. #pragma omp cancel parallel if (omp_get_thread_num () == 5 && x[4])
  111. }
  112. if (v != 6000 || w != 0)
  113. abort ();
  114. return 0;
  115. }
  116. int
  117. main ()
  118. {
  119. int x[] = { 1, 0, 1, 0, 0 };
  120. if (omp_get_cancellation ())
  121. foo (x);
  122. S::verify ();
  123. }