xref: /llvm-project/openmp/runtime/test/tasking/issue-94260-1.cpp (revision 2e57e6366677390110f5382894c8afeba8da7419)
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