xref: /openbsd-src/gnu/gcc/libgomp/testsuite/libgomp.c/omp_orphan.c (revision 404b540a9034ac75a6199ad1a32d1bbc7a0d4210)
1*404b540aSrobert /******************************************************************************
2*404b540aSrobert * FILE: omp_orphan.c
3*404b540aSrobert * DESCRIPTION:
4*404b540aSrobert *   OpenMP Example - Parallel region with an orphaned directive - C/C++ Version
5*404b540aSrobert *   This example demonstrates a dot product  being performed by an orphaned
6*404b540aSrobert *   loop reduction construct.  Scoping of the reduction variable is critical.
7*404b540aSrobert * AUTHOR: Blaise Barney  5/99
8*404b540aSrobert * LAST REVISED: 04/06/05
9*404b540aSrobert ******************************************************************************/
10*404b540aSrobert #include <omp.h>
11*404b540aSrobert #include <stdio.h>
12*404b540aSrobert #include <stdlib.h>
13*404b540aSrobert #define VECLEN 100
14*404b540aSrobert 
15*404b540aSrobert float a[VECLEN], b[VECLEN], sum;
16*404b540aSrobert 
dotprod()17*404b540aSrobert float dotprod ()
18*404b540aSrobert {
19*404b540aSrobert int i,tid;
20*404b540aSrobert 
21*404b540aSrobert tid = omp_get_thread_num();
22*404b540aSrobert #pragma omp for reduction(+:sum)
23*404b540aSrobert   for (i=0; i < VECLEN; i++)
24*404b540aSrobert     {
25*404b540aSrobert     sum = sum + (a[i]*b[i]);
26*404b540aSrobert     printf("  tid= %d i=%d\n",tid,i);
27*404b540aSrobert     }
28*404b540aSrobert 
29*404b540aSrobert return(sum);
30*404b540aSrobert }
31*404b540aSrobert 
32*404b540aSrobert 
main(int argc,char * argv[])33*404b540aSrobert int main (int argc, char *argv[])
34*404b540aSrobert {
35*404b540aSrobert int i;
36*404b540aSrobert 
37*404b540aSrobert for (i=0; i < VECLEN; i++)
38*404b540aSrobert   a[i] = b[i] = 1.0 * i;
39*404b540aSrobert sum = 0.0;
40*404b540aSrobert 
41*404b540aSrobert #pragma omp parallel
42*404b540aSrobert   sum = dotprod();
43*404b540aSrobert 
44*404b540aSrobert printf("Sum = %f\n",sum);
45*404b540aSrobert 
46*404b540aSrobert   return 0;
47*404b540aSrobert }
48