2022-11-04 09:35:42 -07:00

50 lines
1.1 KiB
C

/*
* @@name: masked.1
* @@type: C
* @@operation: compile
* @@expect: success
* @@version: omp_5.1
*/
#include <stdio.h>
extern float average(float,float,float);
void masked_example( float* x, float* xold, int n, float tol )
{
int c, i, toobig;
float error, y;
c = 0;
#pragma omp parallel
{
do {
#pragma omp for private(i)
for( i = 1; i < n-1; ++i ){
xold[i] = x[i];
}
#pragma omp single
{
toobig = 0;
}
#pragma omp for private(i,y,error) reduction(+:toobig)
for( i = 1; i < n-1; ++i ){
y = x[i];
x[i] = average( xold[i-1], x[i], xold[i+1] );
error = y - x[i];
if( error > tol || error < -tol ) ++toobig;
}
#pragma omp masked // primary thread (thread 0)
{
++c;
printf( "iteration %d, toobig=%d\n", c, toobig );
}
} while( toobig > 0 );
#pragma omp barrier
#pragma omp masked filter(1) // thread 1
{
// The printf statement will not be executed
// if the number of threads is less than 2.
printf( "total number of iterations = %d\n", c );
}
}
}