| #include <omp.h> | |
| extern "C" void abort (void); | |
| struct Y | |
| { | |
| int l[5][10]; | |
| }; | |
| struct X | |
| { | |
| struct Y y; | |
| float b[10]; | |
| }; | |
| void | |
| parallel (int a, int b) | |
| { | |
| int i, j; | |
| struct X A[10][5]; | |
| a = b = 3; | |
| for (i = 0; i < 10; i++) | |
| for (j = 0; j < 5; j++) | |
| A[i][j].y.l[3][3] = -10; | |
| #pragma omp parallel shared (a, b, A) num_threads (5) | |
| { | |
| int i, j; | |
| #pragma omp atomic | |
| a += omp_get_num_threads (); | |
| #pragma omp atomic | |
| b += omp_get_num_threads (); | |
| #pragma omp for private (j) | |
| for (i = 0; i < 10; i++) | |
| for (j = 0; j < 5; j++) | |
| A[i][j].y.l[3][3] += 20; | |
| } | |
| for (i = 0; i < 10; i++) | |
| for (j = 0; j < 5; j++) | |
| if (A[i][j].y.l[3][3] != 10) | |
| abort (); | |
| if (a != 28) | |
| abort (); | |
| if (b != 28) | |
| abort (); | |
| } | |
| int | |
| main() | |
| { | |
| parallel (1, 2); | |
| return 0; | |
| } |