extern #ifdef __cplusplus "C" #endif void abort (void); int v[16] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 }; int main () { #pragma omp parallel num_threads (4) #pragma omp single { int i; #pragma omp taskgroup { for (i = 0; i < 16; i += 2) #pragma omp task { #pragma omp task v[i]++; #pragma omp task v[i + 1]++; } } for (i = 0; i < 16; i++) if (v[i] != i + 2) abort (); #pragma omp taskgroup { for (i = 0; i < 16; i += 2) #pragma omp task { #pragma omp task v[i]++; #pragma omp task v[i + 1]++; #pragma omp taskwait } } for (i = 0; i < 16; i++) if (v[i] != i + 3) abort (); #pragma omp taskgroup { for (i = 0; i < 16; i += 2) #pragma omp task { #pragma omp task v[i]++; v[i + 1]++; } #pragma omp taskwait for (i = 0; i < 16; i += 2) #pragma omp task v[i + 1]++; } for (i = 0; i < 16; i++) if (v[i] != i + 4 + (i & 1)) abort (); #pragma omp taskgroup { for (i = 0; i < 16; i += 2) { #pragma omp taskgroup { #pragma omp task v[i]++; #pragma omp task v[i + 1]++; } if (v[i] != i + 5 || v[i + 1] != i + 7) abort (); #pragma omp task v[i]++; } } for (i = 0; i < 16; i++) if (v[i] != i + 6) abort (); } return 0; }