【问题标题】:Populate a large array using OpenMP使用 OpenMP 填充大型数组
【发布时间】: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。

标签: c++ c++11 random openmp


【解决方案1】:

由于它是一个数组,只需将随机分配放在并行 for 部分即可完成工作。 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 for firstprivate(array_size)
{
    for(int i = 0; i < (array_size); i++)
        array[i] = rn;
}

【讨论】:

  • 这不是同一个功能。我了解 OP 希望在整个数组中使用随机数,而不是为每个数组元素分配相同的随机数。
  • 除此之外......声明private(array_size) 似乎是一个非常糟糕的主意。私有变量未初始化
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-09
  • 2012-05-03
  • 2021-01-13
  • 1970-01-01
  • 2012-05-08
相关资源
最近更新 更多