1*2e57e636SJonathan Peyton // RUN: %libomp-cxx-compile-and-run 2*2e57e636SJonathan Peyton 3*2e57e636SJonathan Peyton #include <assert.h> 4*2e57e636SJonathan Peyton #include <stdio.h> 5*2e57e636SJonathan Peyton #include <stdlib.h> 6*2e57e636SJonathan Peyton #include <omp.h> 7*2e57e636SJonathan Peyton 8*2e57e636SJonathan Peyton // The number of times to run each test 9*2e57e636SJonathan Peyton #define NTIMES 2 10*2e57e636SJonathan Peyton 11*2e57e636SJonathan Peyton // Every thread creates a single "increment" task 12*2e57e636SJonathan Peyton void test_tasks() { 13*2e57e636SJonathan Peyton for (int i = 0; i < 100; ++i) 14*2e57e636SJonathan Peyton #pragma omp task 15*2e57e636SJonathan Peyton { 16*2e57e636SJonathan Peyton int tid = omp_get_thread_num(); 17*2e57e636SJonathan Peyton } 18*2e57e636SJonathan Peyton } 19*2e57e636SJonathan Peyton 20*2e57e636SJonathan Peyton // Testing single level of parallelism with increment tasks 21*2e57e636SJonathan Peyton void test_base(int nthreads) { 22*2e57e636SJonathan Peyton #ifdef VERBOSE 23*2e57e636SJonathan Peyton #pragma omp master 24*2e57e636SJonathan Peyton printf(" test_base(%d)\n", nthreads); 25*2e57e636SJonathan Peyton #endif 26*2e57e636SJonathan Peyton #pragma omp parallel num_threads(nthreads) 27*2e57e636SJonathan Peyton { test_tasks(); } 28*2e57e636SJonathan Peyton } 29*2e57e636SJonathan Peyton 30*2e57e636SJonathan Peyton // Testing nested parallel with increment tasks 31*2e57e636SJonathan Peyton // first = nthreads of outer parallel 32*2e57e636SJonathan Peyton // second = nthreads of nested parallel 33*2e57e636SJonathan Peyton void test_nest(int first, int second) { 34*2e57e636SJonathan Peyton #ifdef VERBOSE 35*2e57e636SJonathan Peyton #pragma omp master 36*2e57e636SJonathan Peyton printf(" test_nest(%d, %d)\n", first, second); 37*2e57e636SJonathan Peyton #endif 38*2e57e636SJonathan Peyton #pragma omp parallel num_threads(first) 39*2e57e636SJonathan Peyton { 40*2e57e636SJonathan Peyton for (int i = 0; i < 100; ++i) 41*2e57e636SJonathan Peyton #pragma omp task 42*2e57e636SJonathan Peyton { 43*2e57e636SJonathan Peyton int tid = omp_get_thread_num(); 44*2e57e636SJonathan Peyton } 45*2e57e636SJonathan Peyton test_base(second); 46*2e57e636SJonathan Peyton } 47*2e57e636SJonathan Peyton } 48*2e57e636SJonathan Peyton 49*2e57e636SJonathan Peyton template <typename... Args> 50*2e57e636SJonathan Peyton void run_ntimes(int n, void (*func)(Args...), Args... args) { 51*2e57e636SJonathan Peyton for (int i = 0; i < n; ++i) { 52*2e57e636SJonathan Peyton func(args...); 53*2e57e636SJonathan Peyton } 54*2e57e636SJonathan Peyton } 55*2e57e636SJonathan Peyton 56*2e57e636SJonathan Peyton int main() { 57*2e57e636SJonathan Peyton omp_set_max_active_levels(5); 58*2e57e636SJonathan Peyton 59*2e57e636SJonathan Peyton for (int i = 0; i < 100; ++i) { 60*2e57e636SJonathan Peyton run_ntimes(NTIMES, test_nest, 4, 3); 61*2e57e636SJonathan Peyton run_ntimes(NTIMES, test_nest, 2, 1); 62*2e57e636SJonathan Peyton } 63*2e57e636SJonathan Peyton 64*2e57e636SJonathan Peyton printf("PASS\n"); 65*2e57e636SJonathan Peyton return EXIT_SUCCESS; 66*2e57e636SJonathan Peyton } 67