xref: /openbsd-src/gnu/gcc/libgomp/testsuite/libgomp.c++/shared-1.C (revision 404b540a9034ac75a6199ad1a32d1bbc7a0d4210)
1*404b540aSrobert #include <omp.h>
2*404b540aSrobert 
3*404b540aSrobert extern "C" void abort (void);
4*404b540aSrobert 
5*404b540aSrobert struct Y
6*404b540aSrobert {
7*404b540aSrobert   int l[5][10];
8*404b540aSrobert };
9*404b540aSrobert 
10*404b540aSrobert struct X
11*404b540aSrobert {
12*404b540aSrobert   struct Y y;
13*404b540aSrobert   float b[10];
14*404b540aSrobert };
15*404b540aSrobert 
16*404b540aSrobert void
parallel(int a,int b)17*404b540aSrobert parallel (int a, int b)
18*404b540aSrobert {
19*404b540aSrobert   int i, j;
20*404b540aSrobert   struct X A[10][5];
21*404b540aSrobert   a = b = 3;
22*404b540aSrobert 
23*404b540aSrobert   for (i = 0; i < 10; i++)
24*404b540aSrobert     for (j = 0; j < 5; j++)
25*404b540aSrobert       A[i][j].y.l[3][3] = -10;
26*404b540aSrobert 
27*404b540aSrobert   #pragma omp parallel shared (a, b, A) num_threads (5)
28*404b540aSrobert     {
29*404b540aSrobert       int i, j;
30*404b540aSrobert 
31*404b540aSrobert       #pragma omp atomic
32*404b540aSrobert       a += omp_get_num_threads ();
33*404b540aSrobert 
34*404b540aSrobert       #pragma omp atomic
35*404b540aSrobert       b += omp_get_num_threads ();
36*404b540aSrobert 
37*404b540aSrobert       #pragma omp for private (j)
38*404b540aSrobert       for (i = 0; i < 10; i++)
39*404b540aSrobert 	for (j = 0; j < 5; j++)
40*404b540aSrobert 	  A[i][j].y.l[3][3] += 20;
41*404b540aSrobert 
42*404b540aSrobert     }
43*404b540aSrobert 
44*404b540aSrobert   for (i = 0; i < 10; i++)
45*404b540aSrobert     for (j = 0; j < 5; j++)
46*404b540aSrobert       if (A[i][j].y.l[3][3] != 10)
47*404b540aSrobert 	abort ();
48*404b540aSrobert 
49*404b540aSrobert   if (a != 28)
50*404b540aSrobert     abort ();
51*404b540aSrobert 
52*404b540aSrobert   if (b != 28)
53*404b540aSrobert     abort ();
54*404b540aSrobert }
55*404b540aSrobert 
main()56*404b540aSrobert main()
57*404b540aSrobert {
58*404b540aSrobert   parallel (1, 2);
59*404b540aSrobert   return 0;
60*404b540aSrobert }
61