cancel-parallel-2.c 881 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. /* { dg-do run } */
  2. /* { dg-set-target-env-var OMP_CANCELLATION "true" } */
  3. #include <stdlib.h>
  4. #include <unistd.h>
  5. #include <omp.h>
  6. static void
  7. foo (int *x)
  8. {
  9. #pragma omp parallel firstprivate(x) num_threads (32)
  10. {
  11. int thr = omp_get_thread_num ();
  12. switch (x[thr])
  13. {
  14. case 4:;
  15. #pragma omp cancel parallel
  16. break;
  17. case 3:
  18. #pragma omp task
  19. usleep (1000);
  20. #pragma omp task
  21. usleep (2000);
  22. #pragma omp task
  23. usleep (4000);
  24. break;
  25. case 2:
  26. usleep (1000);
  27. /* FALLTHRU */
  28. case 1:;
  29. #pragma omp cancellation point parallel
  30. break;
  31. }
  32. #pragma omp barrier
  33. if (omp_get_cancellation ())
  34. abort ();
  35. }
  36. }
  37. int
  38. main ()
  39. {
  40. int i, j, x[32] = { 0, 1, 2, 4, 2, 2, 1, 0 };
  41. foo (x);
  42. for (i = 0; i < 32; i++)
  43. {
  44. for (j = 0; j < 32; j++)
  45. x[j] = rand () & 3;
  46. x[rand () & 31] = 4;
  47. foo (x);
  48. }
  49. return 0;
  50. }