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 }