1 extern 2 #ifdef __cplusplus 3 "C" 4 #endif 5 void abort (void); 6 7 void bar(long long int * p)8bar (long long int *p) 9 { 10 p[0] *= 2; 11 #pragma omp task in_reduction (*: p[0]) 12 p[0] *= 3; 13 } 14 15 void foo(long long int * p,long long int * q)16foo (long long int *p, long long int *q) 17 { 18 #pragma omp taskgroup task_reduction (*: p[0]) 19 { 20 #pragma omp task in_reduction (*: p[0]) 21 bar (p); 22 #pragma omp task in_reduction (*: p[0]) 23 bar (p); 24 bar (p); 25 #pragma omp taskgroup task_reduction (*: q[0]) 26 { 27 #pragma omp task in_reduction (*: q[0]) 28 bar (q); 29 #pragma omp task in_reduction (*: q[0]) 30 bar (q); 31 #pragma omp task in_reduction (*: q[0]) 32 bar (q); 33 bar (q); 34 #pragma omp task in_reduction (*: p[0]) 35 { 36 #pragma omp taskgroup task_reduction (*: p[0]) 37 { 38 #pragma omp task in_reduction (*: p[0]) 39 bar (p); 40 p[0] *= 2; 41 #pragma omp task in_reduction (*: p[0]) 42 bar (p); 43 } 44 } 45 } 46 } 47 } 48 49 int main()50main () 51 { 52 long long int p = 1LL, q = 1LL; 53 foo (&p, &q); 54 if (p != 6LL * 6LL * 6LL * 6LL * 6LL * 2LL || q != 6LL * 6LL * 6LL * 6LL) 55 abort (); 56 p = 1LL; 57 q = 1LL; 58 #pragma omp taskgroup 59 foo (&p, &q); 60 if (p != 6LL * 6LL * 6LL * 6LL * 6LL * 2LL || q != 6LL * 6LL * 6LL * 6LL) 61 abort (); 62 p = 1LL; 63 q = 1LL; 64 #pragma omp parallel 65 #pragma omp single 66 foo (&p, &q); 67 if (p != 6LL * 6LL * 6LL * 6LL * 6LL * 2LL || q != 6LL * 6LL * 6LL * 6LL) 68 abort (); 69 return 0; 70 } 71