00001 extern void abort (void); 00002 00003 struct Y 00004 { 00005 int l[5][10]; 00006 }; 00007 00008 struct X 00009 { 00010 struct Y y; 00011 float b[10]; 00012 }; 00013 00014 void 00015 parallel (int a, int b) 00016 { 00017 int i, j; 00018 struct X A[10][5]; 00019 a = b = 3; 00020 00021 for (i = 0; i < 10; i++) 00022 for (j = 0; j < 5; j++) 00023 A[i][j].y.l[3][3] = -10; 00024 00025 #pragma omp parallel shared (a, b, A) num_threads (5) 00026 { 00027 int i, j; 00028 00029 #pragma omp atomic 00030 a += omp_get_num_threads (); 00031 00032 #pragma omp atomic 00033 b += omp_get_num_threads (); 00034 00035 #pragma omp for private (j) 00036 for (i = 0; i < 10; i++) 00037 for (j = 0; j < 5; j++) 00038 A[i][j].y.l[3][3] += 20; 00039 00040 } 00041 00042 for (i = 0; i < 10; i++) 00043 for (j = 0; j < 5; j++) 00044 if (A[i][j].y.l[3][3] != 10) 00045 abort (); 00046 00047 if (a != 28) 00048 abort (); 00049 00050 if (b != 28) 00051 abort (); 00052 } 00053 00054 main() 00055 { 00056 parallel (1, 2); 00057 return 0; 00058 }