| // RUN: %libomp-cxx-compile-and-run | |
| #include <assert.h> | |
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #include <omp.h> | |
| // 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 <typename... Args> | |
| 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; | |
| } |