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