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