/****************************************************************************** * FILE: omp_orphan.c * DESCRIPTION: * OpenMP Example - Parallel region with an orphaned directive - C/C++ Version * This example demonstrates a dot product being performed by an orphaned * loop reduction construct. Scoping of the reduction variable is critical. * AUTHOR: Blaise Barney 5/99 * LAST REVISED: 06/30/05 * * An OpenMP directive that appears independently from another enclosing * directive is said to be an orphaned directive. It exists outside of another * directive's static (lexical) extent. * ******************************************************************************/ #include #include #include #define VECLEN 100 float a[VECLEN], b[VECLEN], sum; void dotprod () { int i,tid; tid = omp_get_thread_num(); #pragma omp for reduction(+:sum) for (i=0; i < VECLEN; i++) { sum = sum + (a[i]*b[i]); printf(" tid= %d i=%d\n",tid,i); } } int main (int argc, char *argv[]) { int i, procs; for (i=0; i < VECLEN; i++) a[i] = b[i] = 1.0 * i; sum = 0.0; /* procs = omp_get_num_procs(); omp_set_num_threads(procs); */ #pragma omp parallel dotprod(); printf("Sum = %f\n",sum); return(0); }