// RUN: %libomp-cxx-compile-and-run #include #include #include #include // The number of times to run each test #define NTIMES 2 // Every thread creates a single "increment" task void test_tasks() { for (int i = 0; i < 100; ++i) #pragma omp task { int tid = omp_get_thread_num(); } } // Testing single level of parallelism with increment tasks void test_base(int nthreads) { #ifdef VERBOSE #pragma omp master printf(" test_base(%d)\n", nthreads); #endif #pragma omp parallel num_threads(nthreads) { test_tasks(); } } // Testing nested parallel with increment tasks // first = nthreads of outer parallel // second = nthreads of nested parallel void test_nest(int first, int second) { #ifdef VERBOSE #pragma omp master printf(" test_nest(%d, %d)\n", first, second); #endif #pragma omp parallel num_threads(first) { for (int i = 0; i < 100; ++i) #pragma omp task { int tid = omp_get_thread_num(); } test_base(second); } } template void run_ntimes(int n, void (*func)(Args...), Args... args) { for (int i = 0; i < n; ++i) { func(args...); } } int main() { omp_set_max_active_levels(5); for (int i = 0; i < 100; ++i) { run_ntimes(NTIMES, test_nest, 4, 3); run_ntimes(NTIMES, test_nest, 2, 1); } printf("PASS\n"); return EXIT_SUCCESS; }