| 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; |
| } |