extern #ifdef __cplusplus "C" #endif void abort (void); #define N 256 int r; void foo (int *a) { int i, j; #pragma omp loop bind(thread) order(concurrent) private (j) lastprivate (i) reduction(+:r) collapse(1) for (i = 0; i < N; i++) { j = i - 2; a[i] = j; r += j; } } void bar (int *a) { int i, j; #pragma omp loop bind(parallel) order(concurrent) private (j) lastprivate (i) reduction(+:r) collapse(1) for (i = 0; i < N; i++) { j = i; a[i] = j; r += j; } } void baz (int *a) { int i, j; #pragma omp loop bind(teams) order(concurrent) private (j) lastprivate (i) reduction(+:r) for (i = 0; i < N; i++) { j = i + 2; a[i] = j; r += j; } } int main () { int a[N], i, j; foo (a); for (i = 0; i < N; ++i) if (a[i] != i - 2) abort (); else a[i] = -35; if (r != N * (N - 5) / 2) abort (); else r = 0; bar (a); for (i = 0; i < N; ++i) if (a[i] != i) abort (); else a[i] = -35; if (r != N * (N - 1) / 2) abort (); else r = 0; #pragma omp parallel loop private (j) lastprivate (i) reduction(+:r) for (i = 0; i < N; i++) { j = i + 4; a[i] = j; r += j; } if (i != N) abort (); for (i = 0; i < N; ++i) if (a[i] != i + 4) abort (); else a[i] = -35; if (r != N * (N + 7) / 2) abort (); else r = 0; #pragma omp parallel bar (a); for (i = 0; i < N; ++i) if (a[i] != i) abort (); else a[i] = -35; if (r != N * (N - 1) / 2) abort (); else r = 0; #pragma omp teams baz (a); for (i = 0; i < N; ++i) if (a[i] != i + 2) abort (); else a[i] = -35; if (r != N * (N + 3) / 2) abort (); else r = 0; #pragma omp teams loop order(concurrent) private (j) lastprivate (i) reduction(+:r) collapse(1) for (i = 0; i < N; i++) { j = i - 4; a[i] = j; r += j; } if (i != N) abort (); for (i = 0; i < N; ++i) if (a[i] != i - 4) abort (); if (r != N * (N - 9) / 2) abort (); return 0; }