Open MPで並列化したら精度が落ちるモンテカルロ法
お世話になります。
現在モンテカルロ法を高速化しようとOpen MPを使って並列化処理を行なっているのですが、Open MPを使ったときと使わなかった時を比べると、実行速度は若干速くなり、逆に結果の精度は悪くなりました。
この原因は何でしょうか?わかる方教えてください。よろしくお願いいたします。
下記プログラムはモンテカルロ法を使って円周率を求めるものです。
【実行結果】
・openMPなしの場合
3.141556216 120948
・openMPありの場合(同じコードで複数回実行)
3.102521972 103864
3.104310832 108247
3.106061276 109388
【実行環境】
g++ (clangではなくGNUの方です)
CPUは2コア4スレッドです。
#include <iostream>
#include <random>
#include <chrono>
#include <iomanip>
#include <omp.h> //openMPを使わない時はコメントアウトします
using namespace std;
const long int N=1'000'000'000;
random_device seed_gen;
std::mt19937 engine(seed_gen());
std::uniform_real_distribution<double> dist(0.0,1.0);
int main(void)
{
double x,y,val=0.0;
long int count=0;
chrono::system_clock::time_point start, end;
start = chrono::system_clock::now();
#pragma omp parallel for reduction(+:count) //同様
for (long int loop=0; loop < N; ++loop)
{
x=dist(engine);
y=dist(engine);
if(x*x+y*y<=1.) count++;
}
end = std::chrono::system_clock::now();
double elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(end-start).count();
val=4*double(count)/N;
cout<<setprecision(10)<<val<<" "<<elapsed<<endl;
return 0;
}