cancel-parallel-3.c 719 B

123456789101112131415161718192021222324252627282930313233343536373839
  1. /* { dg-do run } */
  2. /* { dg-set-target-env-var OMP_CANCELLATION "true" } */
  3. #include <omp.h>
  4. #include <unistd.h>
  5. static inline void
  6. do_some_work (void)
  7. {
  8. asm volatile ("" : : : "memory");
  9. }
  10. int
  11. main ()
  12. {
  13. omp_set_dynamic (0);
  14. omp_set_schedule (omp_sched_static, 1);
  15. #pragma omp parallel num_threads (16)
  16. {
  17. int i, j;
  18. do_some_work ();
  19. #pragma omp barrier
  20. if (omp_get_thread_num () == 1)
  21. {
  22. sleep (2);
  23. #pragma omp cancellation point parallel
  24. }
  25. for (j = 3; j <= 16; j++)
  26. #pragma omp for schedule (runtime) nowait
  27. for (i = 0; i < j; i++)
  28. do_some_work ();
  29. if (omp_get_thread_num () == 0)
  30. {
  31. sleep (1);
  32. #pragma omp cancel parallel
  33. }
  34. }
  35. return 0;
  36. }