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