興味深い問題が出てきました。私は、最大12個のCPUコアを持つモンテカルロ法を使ってPiの価値を評価しようとしました。そして私が知ったのは、4コアに比べ12コアを使用した場合、Piの精度が低下したことです。OpenMP、コア数、乱数計算の精度
3.14159
12コア:
3.1416
私は、OpenMPを実装している。ここ
は(彼らはそれぞれの新しい実行と繰り返している。すなわち、安定している)の結果
4コアがあります機能付きコード
rand_r()
乱数生成用の
(これはあまり良くありませんが、スレッドセーフであることが保証されています)。シードはスレッドごとに異なる値を持っていました。
完全なコードが
#include <iostream>
#include <random>
#include <ctime>
#include "omp.h"
#include <stdlib.h>
using namespace std;
unsigned seed;
int main()
{
double start = time(0);
int n, N;
double x, y;
N = 1<<30;
n = 0;
double pi;
#pragma omp parallel private(x, y, seed)
{
seed = 25234 + 17 * omp_get_thread_num();
#pragma omp for reduction(+:n)
for (int i = 0; i < N; i++) {
x = (double) rand_r(&seed)/(double) RAND_MAX;
y = (double) rand_r(&seed)/(double) RAND_MAX;
if (x*x + y*y <= 1)
n++;
}
}
pi = 4. * n/(double) (N);
cout << pi << endl;
double stop = time(0);
cout << (stop - start) << endl;
return 0;
}
であるが、それはコア数を増やしながら、より悪い精度を持って合理的ですか?
乱数生成と何とか結びついていますか(特に、関数rand_rを使って)?
それはfor-loopの配布についてですか?
ありがとうございます。これはまさに私が思ったものです。 – newt