最近のでの作業では、乱数生成にほぼ理想的なインターフェイスを提供するGibbs sampling
を大いに活用してきました。RVar
悲しいことに、マップでモナド アクションを使用できないため、私は Repa を利用できませんでした。
明らかにモナド マップは一般に並列化できませんが、効果を安全に並列化できるモナドの少なくとも 1 つの例であると思われますRVar
(少なくとも原理的には、私は の内部動作にあまり詳しくありません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
ます)。
それはどのように見えるでしょうか?このクラスには他にどのようなモナドが存在する可能性がありますか? 他の人は、これが Repa でどのように機能するかの可能性を検討しましたか?
最後に、並列モナド アクションのこの概念を一般化できない場合、特定のケースRVar
(非常に便利な場合) でこれを機能させる良い方法を誰かが見つけますか? 並列処理をあきらめることRVar
は、非常に難しいトレードオフです。