1extern void abort (void); 2extern int omp_get_num_threads (void); 3 4struct Y 5{ 6 int l[5][10]; 7}; 8 9struct X 10{ 11 struct Y y; 12 float b[10]; 13}; 14 15void 16parallel (int a, int b) 17{ 18 int i, j; 19 struct X A[10][5]; 20 a = b = 3; 21 22 for (i = 0; i < 10; i++) 23 for (j = 0; j < 5; j++) 24 A[i][j].y.l[3][3] = -10; 25 26 #pragma omp parallel shared (a, b, A) num_threads (5) 27 { 28 int i, j; 29 30 #pragma omp atomic 31 a += omp_get_num_threads (); 32 33 #pragma omp atomic 34 b += omp_get_num_threads (); 35 36 #pragma omp for private (j) 37 for (i = 0; i < 10; i++) 38 for (j = 0; j < 5; j++) 39 A[i][j].y.l[3][3] += 20; 40 41 } 42 43 for (i = 0; i < 10; i++) 44 for (j = 0; j < 5; j++) 45 if (A[i][j].y.l[3][3] != 10) 46 abort (); 47 48 if (a != 28) 49 abort (); 50 51 if (b != 28) 52 abort (); 53} 54 55int 56main() 57{ 58 parallel (1, 2); 59 return 0; 60} 61