【发布时间】:2016-05-18 16:19:21
【问题描述】:
在并行化之前,我在循环外创建了一个default_random_engine 对象,因为创建这样的对象并不便宜。我在循环中重用它。
当与OpenMP 并行化时,我注意到uniform_dist(engine) 对随机引擎进行了可变引用,我认为它不是线程安全的。
程序没有崩溃,但我担心它的正确性。
我假设random_device 是线程安全的,所以我可以在循环内移动default_random_engine 的定义,但我不想每次迭代都创建一个随机引擎对象,因为我读到这并不便宜。
我认为另一种方法是创建default_random_engine 对象的数组(大小:线程数),并使用 OpenMP 函数在每次迭代开始时根据线程 ID 选择正确的对象。
有没有更好的办法?
#include <iostream>
#include <random>
using namespace std;
int main() {
int N = 1000;
vector<int> v(N);
random_device r;
default_random_engine engine(r());
#pragma omp parallel for
for (int i = 0; i < N; ++i) {
uniform_int_distribution<int> uniform_dist(1, 100);
// Perform heavy calculations
v[i] = uniform_dist(engine); // I assume this is thread unsafe
}
return 0;
}
【问题讨论】:
-
是的,每个线程都需要一个单独的生成器实例。
-
检查幻灯片 132...openmp.org/mp-documents/omp-hands-on-SC08.pdf
-
看看
jump的 xoroshiro128+ (xoroshiro.di.unimi.it/xoroshiro128plus.c)
标签: c++ multithreading random openmp