gpt4 book ai didi

c++ - 使用 openMP 的线程安全随机数生成器

转载 作者:行者123 更新时间:2023-11-28 05:23:33 24 4
gpt4 key购买 nike

下面的简单脚本并行产生随机数

#include <random>
#include <iostream>
#include <omp.h>

int main(int argc, char *argv[])
{
// Three integers are expected from the command line.
// The first integer is a random seed
// The second integer is the number of threads.
// The third integer indicates the number of random numbers to produce

// Read the seed and create the random number generator and the random distribution
int seed = std::stoi(argv[1]);
std::mt19937 mt(seed);
std::uniform_real_distribution<float> dist(0, 100);

// Read the number of threads and set it.
int nbThreads = std::stoi(argv[2]);
omp_set_num_threads(nbThreads);

// Number of random number for demonstration
int n = std::stoi(argv[3]);

// Will store the random number to print them conveniently
std::vector<float> store(n);

// produce 'n' random numbers
#pragma omp parallel for
for (int i = 0 ; i < n ; ++i)
{
store[i] = dist(mt);
}

// print the random numbers
for ( auto& rnd : store )
{
std::cout << rnd << std::endl;
}

return 0;
}

上面的脚本在使用单线程时是确定性的

./test 3 1 2
55.0798
7.07249

./test 3 1 2
55.0798
7.07249

./test 7 1 2
7.63083
22.7339


./test 7 1 2
7.63083
22.7339

但是,它是部分随机的,并且在使用多个线程时包含线程之间的相关性(这可能是一个相当大的问题)

./test 3 2 2
43.1925
43.1925

./test 3 2 2
55.0798
7.07249

./test 7 2 2
22.7339
7.63083

./test 7 2 2
7.63083
7.63083

我明白为什么我的代码不是线程安全的,但我不明白如何让它成为线程安全的。是否有可能无论线程数如何都具有确定性输出?

目标是 ./test 87 1 200 产生与 ./test 87 3 200 相同的输出(即线程数不会影响对象存储)。如果这不可能,那么目标是 ./test 87 3 200 产生与 ./test 87 3 200 相同的输出。

最佳答案

您正在与每个线程共享 std::mt19937 mt 对象中的状态,这不是线程安全的。

要么用某种锁定来包装该对象的访问,要么为每个线程提供一个单独的实例 [编辑] 不同的种子(可能来自您创建的 mt19937 的第一个实例),以便每个实例给出不同的结果 [/编辑](如果可以使用 omp 的话)。

关于c++ - 使用 openMP 的线程安全随机数生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40985102/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com