| extern void abort (void); |
| extern int omp_get_num_threads (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; |
| } |