1 extern
2 #ifdef __cplusplus
3 "C"
4 #endif
5 void abort (void);
6 int v[16] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 };
7
8 int
9 main ()
10 {
11 #pragma omp parallel num_threads (4)
12 #pragma omp single
13 {
14 int i;
15 #pragma omp taskgroup
16 {
17 for (i = 0; i < 16; i += 2)
18 #pragma omp task
19 {
20 #pragma omp task
21 v[i]++;
22 #pragma omp task
23 v[i + 1]++;
24 }
25 }
26 for (i = 0; i < 16; i++)
27 if (v[i] != i + 2)
28 abort ();
29 #pragma omp taskgroup
30 {
31 for (i = 0; i < 16; i += 2)
32 #pragma omp task
33 {
34 #pragma omp task
35 v[i]++;
36 #pragma omp task
37 v[i + 1]++;
38 #pragma omp taskwait
39 }
40 }
41 for (i = 0; i < 16; i++)
42 if (v[i] != i + 3)
43 abort ();
44 #pragma omp taskgroup
45 {
46 for (i = 0; i < 16; i += 2)
47 #pragma omp task
48 {
49 #pragma omp task
50 v[i]++;
51 v[i + 1]++;
52 }
53 #pragma omp taskwait
54 for (i = 0; i < 16; i += 2)
55 #pragma omp task
56 v[i + 1]++;
57 }
58 for (i = 0; i < 16; i++)
59 if (v[i] != i + 4 + (i & 1))
60 abort ();
61 #pragma omp taskgroup
62 {
63 for (i = 0; i < 16; i += 2)
64 {
65 #pragma omp taskgroup
66 {
67 #pragma omp task
68 v[i]++;
69 #pragma omp task
70 v[i + 1]++;
71 }
72 if (v[i] != i + 5 || v[i + 1] != i + 7)
73 abort ();
74 #pragma omp task
75 v[i]++;
76 }
77 }
78 for (i = 0; i < 16; i++)
79 if (v[i] != i + 6)
80 abort ();
81 }
82 return 0;
83 }