我从一个OpenMP并行代码部分收到了“总线错误”的信息。我在下面重新创建了一个简单版本的问题。该代码主要对函数uniform_distribution进行多次调用,该函数使用Boost的uniform_int_distribution生成介于0和20000之间的整数。
这篇文章(post)警告说有两个线程正在访问同一个对象。我猜这在我的情况下是指eng。(不幸的是,我不知道如何编写“适当的互斥包装器”,正如该文章建议的那样。)
我想到的一个可能的笨拙解决方案是,在#pragma for循环中创建一个本地eng,并将其作为参数传递给uniform_distribution。我不喜欢这个想法,因为在我的实际代码中,我调用了许多函数,并且传递本地eng会很麻烦。此外,我的担忧是,如果我在uniform_distribution中声明eng,则不同的线程将生成相同的随机数序列。所以我有两个要求:如何并行化?
这篇文章(post)警告说有两个线程正在访问同一个对象。我猜这在我的情况下是指eng。(不幸的是,我不知道如何编写“适当的互斥包装器”,正如该文章建议的那样。)
我想到的一个可能的笨拙解决方案是,在#pragma for循环中创建一个本地eng,并将其作为参数传递给uniform_distribution。我不喜欢这个想法,因为在我的实际代码中,我调用了许多函数,并且传递本地eng会很麻烦。此外,我的担忧是,如果我在uniform_distribution中声明eng,则不同的线程将生成相同的随机数序列。所以我有两个要求:如何并行化?
- 每个线程从其他线程中生成概率独立的随机数?
- RNG上不存在竞争条件?
谢谢,非常感谢您的帮助。
#include <omp.h>
#include <boost/random/uniform_int_distribution.hpp>
boost::random::mt19937 eng;
int uniform_distribution(int rangeLow, int rangeHigh) {
boost::random::uniform_int_distribution<int> unirv(rangeLow, rangeHigh);
return unirv(eng);
}
int main()
{
# pragma omp parallel for private(eng)
for (int bb=0; bb<10000; bb++)
for (int i=0; i<20000; i++)
int a = uniform_distribution(0,20000);
return 0;
}
eng
参数。您能否详细说明(2),并可能提供一个示例?恐怕我不太理解_false sharing_的评论。 - covstat