【发布时间】:2019-11-10 20:35:03
【问题描述】:
我想创建一个大小为 (10^7) 的一维数组并希望随机填充它。是否可以创建多个 10 个数组,每个数组大小为 10^6,随机填充它们,然后使用 OpenMP 将它们合并为一个数组?
std::random_device rd{};
std::mt19937 rng{rd()};
std::bernoulli_distribution distribution(p);
int array_size = 10000000, N = 50;
array = new uint64_t[array_size];
#pragma omp parallel
{
#pragma omp parallel for
for(int i = 0; i < (array_size); i++){
uint64_t rn = 0;
for(int j = 0; j < N; j++){
rn = ((rn<<1)+(distribution(rng)?1:0));
}
array[i] = rn;
}
}
【问题讨论】:
-
Stackoverflow 上有几篇文章讨论了在 OpenMP 代码中使用随机数生成器的各个方面。例如,stackoverflow.com/questions/15504264/boost-random-and-openmp.
-
为此,您需要线程本地 RNG 实例。请注意,mt19937 并不是真正用于并行执行,因此要么为不同的 RNG 使用不同的种子并希望获得 bast,要么使用用于并行执行的 RNG。