OpenMPを使用して次のコードを並列化しようとしていますが、成功しません。 私はいくつかの例をインターネットで検索しましたが、何度もプログラムを実行した後で同じ答えを私に与えるものはありません。OpenMP Paralellize Pi program
int main (int argc, char **argv){
//Variables
int i=0, aux=0;
double step = 1.0/100000.0;
double x=0.0,
pi=0.0,
sum = 0.0;
#pragma omp parallel shared(sum,i) private(x)
{
x = 0.0;
sum = 0.0;
#pragma omp for
for (i=0; i<num_steps; ++i) {
x = (i-0.5)*step;
#pragma omp critical
sum += 4.0/(1.0+x*x);
}
}
/* All threads join master thread and terminate */
pi= step*sum;
printf("PI value = %f\n", pi);
}
は、事前にありがとう:
#include <stdio.h>
#include <omp.h>
#define NUM_THREADS 2
long num_steps = 100000;
double step = 1.0/100000.0;
int main() {
int i;
double x, pi, sum = 0.0;
for(i = 0; i < num_steps; ++i) {
x = (i-0.5)*step;
sum += 4.0/(1.0+x*x);
}
pi = step*sum;
printf("PI value = %f\n", pi);
}
これは私がこれまで持っているソリューションです。
このコードは私にそれを数回実行した後に同じ結果を与えるものではありません。 – Alessandroempire
'reduce'と' nowait'を組み合わせることは競合条件につながる可能性があるため危険です。特に、 'reduction'節が並列構造に適用され、並列領域に適用されない場合、危険です。それに加えて、そのような場合には 'nowait'は役に立たない。 –
@Alessandroempireそれは奇妙なことですが、どちらのコードでもコンピュータ上で合った結果が得られます(共有iでは間違っていました)、最初のものはあなたの答えと同じように見えます。あなたのコードで一貫した結果が得られますか? – MakisH