在Repa数组上的并行mapM

在我最近的Gibbs sampling 工作中 ,我一直在使用RVar ,在我看来,它提供了一个非常理想的随机数生成接口。 可悲的是,由于无法在地图中使用monadic动作,我一直无法使用Repa。

虽然明显的单子映射一般是不可能并行化的,但在我看来, RVar可能至less是一个monad的例子,在这个例子中,效果可以被安全地并行化(至less在原则上,我并不熟悉内部工作原理RVar )。 也就是说,我想写下如下的东西,

 drawClass :: Sample -> RVar Class drawClass = ... drawClasses :: Array U DIM1 Sample -> RVar (Array U DIM1 Class) drawClasses samples = A.mapM drawClass samples 

A.mapM看起来像这样,

 mapM :: ParallelMonad m => (a -> mb) -> Array r sh a -> m (Array r sh b) 

虽然清楚这将如何工作取决于RVar及其基础RandomSource ,原则上可能会认为这将涉及为每个产生的线程绘制一个新的随机种子,并照常进行。

直觉上,这个想法似乎可能会推广到其他一些单子。

所以,我的问题是:是否可以构造一个类的ParallelMonad单子的影响可以安全地并行化(大概居住,至lessRVar )?

它看起来像什么? 还有什么其他monad可以居住在这个class? 有其他人考虑这可能会在维修工作吗?

最后,如果这种并行一元行为的概念不能一概而论,有没有人看到在RVar的特定情况下(这将是非常有用的)做这个工作的任何好方法? 放弃RVar进行并行是非常困难的权衡。

这可能不是一个好主意,因为PRNG具有固有的连续性。 相反,你可能想要如下转换你的代码:

  1. 声明一个IO函数( main ,或者你有什么)。
  2. 根据需要读取尽可能多的随机数。
  3. 将(现在纯净的)号码传递给您的重新设定function。