并行mapM在Repa阵列上
在我最近使用Gibbs sampling
工作中,我一直在大量使用RVar
,在我看来,它提供了一个接近理想的随机数生成接口。 可悲的是,由于无法在地图中使用monadic动作,我无法使用Repa。
虽然一般来说显然一元贴图是不可能平行化的,但在我看来, RVar
可能至少是一个monad的例子,其中的效果可以安全并行化(至少在原则上;我并不熟悉内部工作原理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 -> m b) -> Array r sh a -> m (Array r sh b)
虽然清楚这是如何工作的,但关键取决于RVar
及其基础RandomSource
,原则上可以认为这将涉及为每个产生的线程绘制一个新的随机种子并像平常一样继续进行。
直观地看,这个想法似乎可能会推广到其他一些单子。
所以,我的问题是:是否可以构造一个单体类的ParallelMonad
,其中的效果可以安全地并行化(至少可以由RVar
)?
它看起来像什么? 还有什么其他monad可以居住在这个班级? 有其他人考虑过这种方式可能在Repa中有效吗?
最后,如果这种并行一元行为的概念不能一概而论,是否有人看到在RVar
的特定情况下进行这项工作的好方法(它会非常有用)? 放弃RVar
进行并行处理是非常困难的交换。
由于PRNG固有的连续性,这可能不是一个好主意。 相反,您可能想要按如下方式转换代码:
main
,或者你有什么)。