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
parallel(int a,int b)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 int
main()57 main()
58 {
59   parallel (1, 2);
60   return 0;
61 }
62