我有一个循环,应该通过插入一个 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 是线程安全的,只要
您无法访问任何给定的对象
两个线程同时进行。 (访问
两个不同的对象是可以的,只要
因为他们不共享引擎)。如果你
需要这样的安全性,那就是
自己滚动起来很简单
适当的互斥体包装。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)