nested-3.c 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. /* { dg-additional-options "-Wno-deprecated-declarations" } */
  2. #include <omp.h>
  3. #include <stdlib.h>
  4. #include <string.h>
  5. int
  6. main (void)
  7. {
  8. int e[3];
  9. memset (e, '\0', sizeof (e));
  10. omp_set_nested (1);
  11. omp_set_dynamic (0);
  12. if (omp_in_parallel ()
  13. || omp_get_level () != 0
  14. || omp_get_ancestor_thread_num (0) != 0
  15. || omp_get_ancestor_thread_num (-1) != -1
  16. || omp_get_ancestor_thread_num (1) != -1
  17. || omp_get_team_size (0) != 1
  18. || omp_get_team_size (-1) != -1
  19. || omp_get_team_size (1) != -1
  20. || omp_get_active_level () != 0)
  21. abort ();
  22. #pragma omp parallel num_threads (4)
  23. {
  24. int tn1 = omp_get_thread_num ();
  25. if (omp_in_parallel () != 1
  26. || omp_get_num_threads () != 4
  27. || tn1 >= 4 || tn1 < 0
  28. || omp_get_level () != 1
  29. || omp_get_ancestor_thread_num (0) != 0
  30. || omp_get_ancestor_thread_num (1) != tn1
  31. || omp_get_ancestor_thread_num (-1) != -1
  32. || omp_get_ancestor_thread_num (2) != -1
  33. || omp_get_team_size (0) != 1
  34. || omp_get_team_size (1) != omp_get_num_threads ()
  35. || omp_get_team_size (-1) != -1
  36. || omp_get_team_size (2) != -1
  37. || omp_get_active_level () != 1)
  38. #pragma omp atomic
  39. e[0] += 1;
  40. #pragma omp parallel if (0) num_threads(5) firstprivate(tn1)
  41. {
  42. int tn2 = omp_get_thread_num ();
  43. if (omp_in_parallel () != 1
  44. || omp_get_num_threads () != 1
  45. || tn2 != 0
  46. || omp_get_level () != 2
  47. || omp_get_ancestor_thread_num (0) != 0
  48. || omp_get_ancestor_thread_num (1) != tn1
  49. || omp_get_ancestor_thread_num (2) != tn2
  50. || omp_get_ancestor_thread_num (-1) != -1
  51. || omp_get_ancestor_thread_num (3) != -1
  52. || omp_get_team_size (0) != 1
  53. || omp_get_team_size (1) != 4
  54. || omp_get_team_size (2) != 1
  55. || omp_get_team_size (-1) != -1
  56. || omp_get_team_size (3) != -1
  57. || omp_get_active_level () != 1)
  58. #pragma omp atomic
  59. e[1] += 1;
  60. #pragma omp parallel num_threads(2) firstprivate(tn1, tn2)
  61. {
  62. int tn3 = omp_get_thread_num ();
  63. if (omp_in_parallel () != 1
  64. || omp_get_num_threads () != 2
  65. || tn3 > 1 || tn3 < 0
  66. || omp_get_level () != 3
  67. || omp_get_ancestor_thread_num (0) != 0
  68. || omp_get_ancestor_thread_num (1) != tn1
  69. || omp_get_ancestor_thread_num (2) != tn2
  70. || omp_get_ancestor_thread_num (3) != tn3
  71. || omp_get_ancestor_thread_num (-1) != -1
  72. || omp_get_ancestor_thread_num (4) != -1
  73. || omp_get_team_size (0) != 1
  74. || omp_get_team_size (1) != 4
  75. || omp_get_team_size (2) != 1
  76. || omp_get_team_size (3) != 2
  77. || omp_get_team_size (-1) != -1
  78. || omp_get_team_size (4) != -1
  79. || omp_get_active_level () != 2)
  80. #pragma omp atomic
  81. e[2] += 1;
  82. }
  83. }
  84. }
  85. if (e[0] || e[1] || e[2])
  86. abort ();
  87. return 0;
  88. }