#include #include int main () { omp_set_dynamic (0); omp_set_nested (1); if (omp_in_parallel ()) abort (); #pragma omp parallel num_threads (3) if (omp_get_thread_num () == 2) { if (!omp_in_parallel ()) abort (); #pragma omp parallel num_threads (3) if (omp_get_thread_num () == 1) { if (!omp_in_parallel () || omp_get_level () != 2 || omp_get_ancestor_thread_num (0) != 0 || omp_get_ancestor_thread_num (1) != 2 || omp_get_ancestor_thread_num (2) != 1 || omp_get_ancestor_thread_num (3) != -1) abort (); #pragma omp target if (0) { if (omp_in_parallel () || omp_get_level () != 0 || omp_get_ancestor_thread_num (0) != 0 || omp_get_ancestor_thread_num (1) != -1) abort (); #pragma omp parallel num_threads (2) { if (!omp_in_parallel () || omp_get_level () != 1 || omp_get_ancestor_thread_num (0) != 0 || omp_get_ancestor_thread_num (1) != omp_get_thread_num () || omp_get_ancestor_thread_num (2) != -1) abort (); } } #pragma omp target if (0) { #pragma omp teams thread_limit (2) { if (omp_in_parallel () || omp_get_level () != 0 || omp_get_ancestor_thread_num (0) != 0 || omp_get_ancestor_thread_num (1) != -1) abort (); #pragma omp parallel num_threads (2) { if (!omp_in_parallel () || omp_get_level () != 1 || omp_get_ancestor_thread_num (0) != 0 || omp_get_ancestor_thread_num (1) != omp_get_thread_num () || omp_get_ancestor_thread_num (2) != -1) abort (); } } } } } return 0; }