91

最近のでの作業では、乱数生成にほぼ理想的なインターフェイスを提供する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は、非常に難しいトレードオフです。

4

2 に答える 2

4

PRNG は本質的にシーケンシャルな性質を持っているため、これを行うのはおそらく良い考えではありません。代わりに、次のようにコードを移行することをお勧めします。

  1. IO関数を宣言します(main、またはあなたが持っているもの)。
  2. 必要な数の乱数を読み取ります。
  3. (現在は純粋な) 数値を repa 関数に渡します。
于 2013-05-15T17:39:14.707 に答える