Оценка числа pi с помощью N итераций осуществляется по следующему
алгоритму:
float EstPiFloatOMP( int N )
{
float H;
float Estimate;
int i;
float Sum2;
float X;
H = 1.0 /( float )( 2 * N );
Sum2 = 0.0;
for( i = 1; i < = N; i++ )
{
X =
H *( float )( 2 * i - 1 );
Sum2 = Sum2 +
1.0 /( 1.0 + X * X );
}
Estimate = 4.0 * Sum2 /( float )( N );
return Estimate;
}
Вычисления в double-арифметике аналогичны. Единственным кодом, который
возможно распараллелить здесь является цикл for. Т.е. параллельная реализация
имеет вид:
float EstPiFloatOMP( int N )
{
float
H;
float Estimate;
int i;
float Sum2;
float X;
H = 1.0 /( float )( 2 * N );
Sum2 = 0.0;
#pragma omp parallel for private(X) shared(H) reduction(+:
Sum2)
for( i = 1; i < = N; i++ )
{
X = H *( float )( 2 * i - 1 );
Sum2 = Sum2 + 1.0 /( 1.0 +
X * X );
}
Estimate = 4.0 * Sum2 /( float )( N );
return Estimate;
}
Таким образом на разных процессорах/ядрах вычисляются различные "куски" суммы
ряда, которые затем собираются в мастер-потоке путем редукции (reduction(+:
Sum2)).