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 }