我的目标是并行使用parMap
从parallel package计算,但我也想有点随机性添加到我的采样功能。具有快速随机性和纯度的并行计算?
没有随机性我的计算仅仅是一些数字运算,所以它是纯粹的,我可以用parMap
。为了获得好的结果,我需要在每个步骤取多个样本并对结果进行平均。采样需要随机化。
一个解决方案可能是使用random package,调用randoms
,然后在计算过程中使用该列表(通过将纯懒惰列表传递给计算,我会保持纯净)。不幸的是,这是一个非常缓慢的随机数生成器,我需要大量的随机数,所以我宁愿为使用mwc-random或mersenne-random(虽然,我不认为梅森随机仍维持)。
使用类似unsafePerformIO
和mwc-random一起编写像randoms
这样的函数是否安全?这样的事情:
randomsMWC :: Variate a => GenST s -> [a]
randomsMWC g = unsafePerformIO $ unsafeSTToIO $ randomsMWC' g
where
randomsMWC' g = do
a <- uniform g
as <- unsafeInterleaveST $ randomsMWC' g
return (a : as)
我是否需要改为parallel number generator?还是我需要咬紧牙关,并承认我的算法不是纯粹的,而不使用慢速随机包?
对此提出建议?谢谢!
梅森 - 随机pure64既快速又允许多台发电机 - 所以你可以每个线程一个。 – 2013-04-27 12:07:52
@DonStewart多个生成器对于并行哈希克来说完全没用。没有必要使用并行代码中的线程特定资源,也不应该有 - 它会引入非确定性。这确实是一个难题。 – Carl 2013-04-27 18:05:40
卡尔 - 不是。您可以以数据并行方式复制随机生成,避免共享资源上的争用。例如,考虑树形结构的缩减。 – 2013-04-28 09:20:00