xref: /llvm-project/openmp/runtime/test/tasking/issue-69733.c (revision 41ca9104ac1e0bf248d4082f45c5ad03ddd55727)
1*41ca9104SJonathan Peyton // RUN: %libomp-compile-and-run
2*41ca9104SJonathan Peyton 
3*41ca9104SJonathan Peyton #include <stdio.h>
4*41ca9104SJonathan Peyton #include <stdlib.h>
5*41ca9104SJonathan Peyton #include <omp.h>
6*41ca9104SJonathan Peyton 
7*41ca9104SJonathan Peyton int a;
8*41ca9104SJonathan Peyton 
inc_a()9*41ca9104SJonathan Peyton void inc_a() {
10*41ca9104SJonathan Peyton #pragma omp atomic
11*41ca9104SJonathan Peyton   a++;
12*41ca9104SJonathan Peyton }
13*41ca9104SJonathan Peyton 
root_team_detached()14*41ca9104SJonathan Peyton void root_team_detached() {
15*41ca9104SJonathan Peyton   a = 0;
16*41ca9104SJonathan Peyton   omp_event_handle_t ev;
17*41ca9104SJonathan Peyton #pragma omp task detach(ev)
18*41ca9104SJonathan Peyton   inc_a();
19*41ca9104SJonathan Peyton   omp_fulfill_event(ev);
20*41ca9104SJonathan Peyton   if (a != 1) {
21*41ca9104SJonathan Peyton     fprintf(stderr, "error: root_team_detached(): a != 1\n");
22*41ca9104SJonathan Peyton     exit(EXIT_FAILURE);
23*41ca9104SJonathan Peyton   }
24*41ca9104SJonathan Peyton }
25*41ca9104SJonathan Peyton 
root_team_hidden_helpers()26*41ca9104SJonathan Peyton void root_team_hidden_helpers() {
27*41ca9104SJonathan Peyton   a = 0;
28*41ca9104SJonathan Peyton #pragma omp target nowait
29*41ca9104SJonathan Peyton   inc_a();
30*41ca9104SJonathan Peyton 
31*41ca9104SJonathan Peyton #pragma omp taskwait
32*41ca9104SJonathan Peyton 
33*41ca9104SJonathan Peyton   if (a != 1) {
34*41ca9104SJonathan Peyton     fprintf(stderr, "error: root_team_hidden_helpers(): a != 1\n");
35*41ca9104SJonathan Peyton     exit(EXIT_FAILURE);
36*41ca9104SJonathan Peyton   }
37*41ca9104SJonathan Peyton }
38*41ca9104SJonathan Peyton 
parallel_detached(int nth1)39*41ca9104SJonathan Peyton void parallel_detached(int nth1) {
40*41ca9104SJonathan Peyton   a = 0;
41*41ca9104SJonathan Peyton   omp_event_handle_t *evs =
42*41ca9104SJonathan Peyton       (omp_event_handle_t *)malloc(sizeof(omp_event_handle_t) * nth1);
43*41ca9104SJonathan Peyton #pragma omp parallel num_threads(nth1)
44*41ca9104SJonathan Peyton   {
45*41ca9104SJonathan Peyton     int tid = omp_get_thread_num();
46*41ca9104SJonathan Peyton     omp_event_handle_t e = evs[tid];
47*41ca9104SJonathan Peyton #pragma omp task detach(e)
48*41ca9104SJonathan Peyton     inc_a();
49*41ca9104SJonathan Peyton     omp_fulfill_event(e);
50*41ca9104SJonathan Peyton   }
51*41ca9104SJonathan Peyton   free(evs);
52*41ca9104SJonathan Peyton   if (a != nth1) {
53*41ca9104SJonathan Peyton     fprintf(stderr, "error: parallel_detached(): a (%d) != %d\n", a, nth1);
54*41ca9104SJonathan Peyton     exit(EXIT_FAILURE);
55*41ca9104SJonathan Peyton   }
56*41ca9104SJonathan Peyton }
57*41ca9104SJonathan Peyton 
parallel_hidden_helpers(int nth1)58*41ca9104SJonathan Peyton void parallel_hidden_helpers(int nth1) {
59*41ca9104SJonathan Peyton   a = 0;
60*41ca9104SJonathan Peyton #pragma omp parallel num_threads(nth1)
61*41ca9104SJonathan Peyton   {
62*41ca9104SJonathan Peyton #pragma omp target nowait
63*41ca9104SJonathan Peyton     inc_a();
64*41ca9104SJonathan Peyton   }
65*41ca9104SJonathan Peyton   if (a != nth1) {
66*41ca9104SJonathan Peyton     fprintf(stderr, "error: parallel_hidden_helpers(): a (%d) != %d\n", a,
67*41ca9104SJonathan Peyton             nth1);
68*41ca9104SJonathan Peyton     exit(EXIT_FAILURE);
69*41ca9104SJonathan Peyton   }
70*41ca9104SJonathan Peyton }
71*41ca9104SJonathan Peyton 
nested_parallel_detached(int nth1,int nth2)72*41ca9104SJonathan Peyton void nested_parallel_detached(int nth1, int nth2) {
73*41ca9104SJonathan Peyton   a = 0;
74*41ca9104SJonathan Peyton   omp_event_handle_t **evs =
75*41ca9104SJonathan Peyton       (omp_event_handle_t **)malloc(sizeof(omp_event_handle_t *) * nth1);
76*41ca9104SJonathan Peyton #pragma omp parallel num_threads(nth1)
77*41ca9104SJonathan Peyton   {
78*41ca9104SJonathan Peyton     int tid = omp_get_thread_num();
79*41ca9104SJonathan Peyton     evs[tid] = (omp_event_handle_t *)malloc(sizeof(omp_event_handle_t) * nth2);
80*41ca9104SJonathan Peyton #pragma omp parallel num_threads(nth2) shared(tid)
81*41ca9104SJonathan Peyton     {
82*41ca9104SJonathan Peyton       int tid2 = omp_get_thread_num();
83*41ca9104SJonathan Peyton       omp_event_handle_t e = evs[tid][tid2];
84*41ca9104SJonathan Peyton #pragma omp task detach(e)
85*41ca9104SJonathan Peyton       inc_a();
86*41ca9104SJonathan Peyton       omp_fulfill_event(e);
87*41ca9104SJonathan Peyton     }
88*41ca9104SJonathan Peyton     free(evs[tid]);
89*41ca9104SJonathan Peyton   }
90*41ca9104SJonathan Peyton   free(evs);
91*41ca9104SJonathan Peyton   if (a != nth1 * nth2) {
92*41ca9104SJonathan Peyton     fprintf(stderr, "error: nested_parallel_detached(): a (%d) != %d * %d\n", a,
93*41ca9104SJonathan Peyton             nth1, nth2);
94*41ca9104SJonathan Peyton     exit(EXIT_FAILURE);
95*41ca9104SJonathan Peyton   }
96*41ca9104SJonathan Peyton }
97*41ca9104SJonathan Peyton 
nested_parallel_hidden_helpers(int nth1,int nth2)98*41ca9104SJonathan Peyton void nested_parallel_hidden_helpers(int nth1, int nth2) {
99*41ca9104SJonathan Peyton   a = 0;
100*41ca9104SJonathan Peyton #pragma omp parallel num_threads(nth1)
101*41ca9104SJonathan Peyton   {
102*41ca9104SJonathan Peyton #pragma omp parallel num_threads(nth2)
103*41ca9104SJonathan Peyton     {
104*41ca9104SJonathan Peyton #pragma omp target nowait
105*41ca9104SJonathan Peyton       inc_a();
106*41ca9104SJonathan Peyton     }
107*41ca9104SJonathan Peyton   }
108*41ca9104SJonathan Peyton   if (a != nth1 * nth2) {
109*41ca9104SJonathan Peyton     fprintf(stderr,
110*41ca9104SJonathan Peyton             "error: nested_parallel_hidden_helpers(): a (%d) != %d * %d\n", a,
111*41ca9104SJonathan Peyton             nth1, nth2);
112*41ca9104SJonathan Peyton     exit(EXIT_FAILURE);
113*41ca9104SJonathan Peyton   }
114*41ca9104SJonathan Peyton }
115*41ca9104SJonathan Peyton 
main()116*41ca9104SJonathan Peyton int main() {
117*41ca9104SJonathan Peyton   int i, nth1, nth2;
118*41ca9104SJonathan Peyton 
119*41ca9104SJonathan Peyton   omp_set_max_active_levels(2);
120*41ca9104SJonathan Peyton   omp_set_dynamic(0);
121*41ca9104SJonathan Peyton 
122*41ca9104SJonathan Peyton   for (i = 0; i < 10; ++i)
123*41ca9104SJonathan Peyton     root_team_detached();
124*41ca9104SJonathan Peyton 
125*41ca9104SJonathan Peyton   for (i = 0; i < 10; ++i)
126*41ca9104SJonathan Peyton     root_team_hidden_helpers();
127*41ca9104SJonathan Peyton 
128*41ca9104SJonathan Peyton   for (i = 0; i < 10; ++i)
129*41ca9104SJonathan Peyton     for (nth1 = 1; nth1 <= 4; ++nth1)
130*41ca9104SJonathan Peyton       parallel_detached(nth1);
131*41ca9104SJonathan Peyton 
132*41ca9104SJonathan Peyton   for (i = 0; i < 10; ++i)
133*41ca9104SJonathan Peyton     for (nth1 = 1; nth1 <= 4; ++nth1)
134*41ca9104SJonathan Peyton       parallel_hidden_helpers(nth1);
135*41ca9104SJonathan Peyton 
136*41ca9104SJonathan Peyton   for (i = 0; i < 10; ++i)
137*41ca9104SJonathan Peyton     for (nth1 = 1; nth1 <= 4; ++nth1)
138*41ca9104SJonathan Peyton       for (nth2 = 1; nth2 <= 4; ++nth2)
139*41ca9104SJonathan Peyton         nested_parallel_detached(nth1, nth2);
140*41ca9104SJonathan Peyton 
141*41ca9104SJonathan Peyton   for (i = 0; i < 10; ++i)
142*41ca9104SJonathan Peyton     for (nth1 = 1; nth1 <= 4; ++nth1)
143*41ca9104SJonathan Peyton       for (nth2 = 1; nth2 <= 4; ++nth2)
144*41ca9104SJonathan Peyton         nested_parallel_hidden_helpers(nth1, nth2);
145*41ca9104SJonathan Peyton 
146*41ca9104SJonathan Peyton   return 0;
147*41ca9104SJonathan Peyton }
148