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*404b540aSrobertfloat 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*404b540aSrobertint 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