我并行生成一系列随机数,但根据我调用的线程数,我得到不同的结果。由此我得出结论,我在某处犯了错误!
注意我使用的是相同的种子,它与线程数无关——所以结果应该是一样的!
这是 MWE,它生成一个介于 0..1 之间的数字,如果生成的变量大于 0.5,则增加一个变量:
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
#include "omp.h"
#include <random>
typedef std::uniform_real_distribution<double> distr_uni;
#define max_threads 1
using namespace std;
int main(int argc, char* argv[])
{
int reservoir_counter, accepted_tube=0;
double r;
omp_set_num_threads(max_threads);
#pragma omp parallel
{
mt19937 eng(0);
distr_uni uniform(0, 1);
#pragma omp for private(r, reservoir_counter) reduction(+:accepted_tube)
for(reservoir_counter=0; reservoir_counter<100000; reservoir_counter++)
{
r = uniform(eng);
if(r>0.5)
{
accepted_tube++;
}
}
}
cout << accepted_tube << endl;
return 0;
}
当我设置max_threads=1
时,我得到 50027,但是当max_threads=60
(在支持它的机器上......)我得到 50440。
有人可以发现我显然存在的错误吗?我在并行化区域内声明了敏感的 RNG 及其引擎,所以我并不清楚错误可能在哪里。