xref: /openbsd-src/gnu/gcc/libgomp/testsuite/libgomp.c/appendix-a/a.16.1.c (revision 404b540a9034ac75a6199ad1a32d1bbc7a0d4210)
1*404b540aSrobert /* { dg-do run } */
2*404b540aSrobert 
3*404b540aSrobert #include <stdio.h>
4*404b540aSrobert 
5*404b540aSrobert float
work1(int i)6*404b540aSrobert work1 (int i)
7*404b540aSrobert {
8*404b540aSrobert   return 1.0 * i;
9*404b540aSrobert }
10*404b540aSrobert 
11*404b540aSrobert float
work2(int i)12*404b540aSrobert work2 (int i)
13*404b540aSrobert {
14*404b540aSrobert   return 2.0 * i;
15*404b540aSrobert }
16*404b540aSrobert 
17*404b540aSrobert void
a16(float * x,float * y,int * index,int n)18*404b540aSrobert a16 (float *x, float *y, int *index, int n)
19*404b540aSrobert {
20*404b540aSrobert   int i;
21*404b540aSrobert #pragma omp parallel for shared(x, y, index, n)
22*404b540aSrobert   for (i = 0; i < n; i++)
23*404b540aSrobert     {
24*404b540aSrobert #pragma omp atomic
25*404b540aSrobert       x[index[i]] += work1 (i);
26*404b540aSrobert       y[i] += work2 (i);
27*404b540aSrobert     }
28*404b540aSrobert }
29*404b540aSrobert int
main()30*404b540aSrobert main ()
31*404b540aSrobert {
32*404b540aSrobert   float x[1000];
33*404b540aSrobert   float y[10000];
34*404b540aSrobert   int index[10000];
35*404b540aSrobert   int i;
36*404b540aSrobert   for (i = 0; i < 10000; i++)
37*404b540aSrobert     {
38*404b540aSrobert       index[i] = i % 1000;
39*404b540aSrobert       y[i] = 0.0;
40*404b540aSrobert     }
41*404b540aSrobert   for (i = 0; i < 1000; i++)
42*404b540aSrobert     x[i] = 0.0;
43*404b540aSrobert   a16 (x, y, index, 10000);
44*404b540aSrobert   for (i = 0; i < 10; i++)
45*404b540aSrobert     printf ("x[%d] = %f, y[%d] = %f\n", i, x[i], i, y[i]);
46*404b540aSrobert   return 0;
47*404b540aSrobert }
48