| extern | |
| #ifdef __cplusplus | |
| "C" | |
| #endif | |
| void abort (void); | |
| void | |
| foo (int i, char *j) | |
| { | |
| #pragma omp atomic | |
| j[i]++; | |
| #pragma omp ordered threads | |
| { | |
| int t; | |
| #pragma omp atomic read | |
| t = j[i]; | |
| if (t != 3) | |
| abort (); | |
| if (i > 1) | |
| { | |
| #pragma omp atomic read | |
| t = j[i - 1]; | |
| if (t == 2) | |
| abort (); | |
| } | |
| if (i < 127) | |
| { | |
| #pragma omp atomic read | |
| t = j[i + 1]; | |
| if (t == 4) | |
| abort (); | |
| } | |
| } | |
| #pragma omp atomic | |
| j[i]++; | |
| } | |
| int | |
| main () | |
| { | |
| int i; | |
| char j[128]; | |
| #pragma omp parallel | |
| { | |
| #pragma omp for | |
| for (i = 0; i < 128; i++) | |
| j[i] = 0; | |
| #pragma omp for ordered schedule(dynamic, 1) | |
| for (i = 0; i < 128; i++) | |
| { | |
| #pragma omp atomic | |
| j[i]++; | |
| #pragma omp ordered threads | |
| { | |
| int t; | |
| #pragma omp atomic read | |
| t = j[i]; | |
| if (t != 1) | |
| abort (); | |
| if (i > 1) | |
| { | |
| #pragma omp atomic read | |
| t = j[i - 1]; | |
| if (t == 0) | |
| abort (); | |
| } | |
| if (i < 127) | |
| { | |
| #pragma omp atomic read | |
| t = j[i + 1]; | |
| if (t == 2) | |
| abort (); | |
| } | |
| } | |
| #pragma omp atomic | |
| j[i]++; | |
| } | |
| #pragma omp for ordered schedule(static, 1) | |
| for (i = 0; i < 128; i++) | |
| foo (i, j); | |
| } | |
| return 0; | |
| } |