Boost RNG的线程安全
-
05-10-2019 - |
题
我有一个循环,应该通过插入一个OpenMP Pragma来很好地平行:
boost::normal_distribution<double> ddist(0, pow(retention, i - 1));
boost::variate_generator<gen &, BOOST_TYPEOF(ddist)> dgen(rng, ddist);
// Diamond
const std::uint_fast32_t dno = 1 << i - 1;
// #pragma omp parallel for
for (std::uint_fast32_t x = 0; x < dno; x++)
for (std::uint_fast32_t y = 0; y < dno; y++)
{
const std::uint_fast32_t diff = size/dno;
const std::uint_fast32_t x1 = x*diff, x2 = (x + 1)*diff;
const std::uint_fast32_t y1 = y*diff, y2 = (y + 1)*diff;
double avg =
(arr[x1][y1] + arr[x1][y2] + arr[x2][y1] + arr[x2][y2])/4;
arr[(x1 + x2)/2][(y1 + y2)/2] = avg + dgen();
}
(除非我犯错,否则每个执行根本不取决于其他执行。对不起,并非所有代码都已插入)。
但是我的问题是 - Boost RNG线程安全吗?他们似乎是指GCC的GCC代码,因此,即使GCC代码是线程安全的,对于其他平台也不是这种情况。
解决方案
浏览Boost邮件列表档案提供:
BOOST.RANDOM不维护需要保护多线程的全球状态。
只要您不同时从两个线程访问任何给定的对象,boost.random就可以使用线程安全。 (只要不共享引擎,访问两个不同的对象就可以了)。如果您需要这样的安全性,那么用适当的静音包装器独自滚动是微不足道的。
其他提示
如果您担心线程安全性,请不要使用Boost,请使用TRNG。它是一个平行的随机数生成库,该库构建为在德国的蒂娜集群上运行。它允许您创建多个随机数流。这里有一个有关如何将TRNG与OpenMP一起使用的教程 http://www.lindonslog.com/programming/parallallal-random-number-generation-trng/ 就像您试图做的一样。您根据使用的线程数量创建独立数量的流数,然后使用线程等级从它们中绘制。这一切都在上述教程中。
不隶属于 StackOverflow