arrays haskell parallel-processing repa

arrays - Parallel mapM en arreglos de Repa



haskell parallel-processing (1)

En mi work reciente con el Gibbs sampling , he estado haciendo un gran uso del RVar que, en mi opinión, proporciona una interfaz casi ideal para la generación de números aleatorios. Lamentablemente, no he podido utilizar Repa debido a la imposibilidad de usar acciones monádicas en los mapas.

Si bien los mapas claramente monádicos no se pueden paralelizar en general, me parece que RVar puede ser al menos un ejemplo de una mónada donde los efectos se pueden paralelizar de forma segura (al menos en principio; no estoy terriblemente familiarizado con el funcionamiento interno de RVar ). A saber, quiero escribir algo como lo siguiente,

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

donde A.mapM sería algo así como

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

Aunque claramente cómo funcionaría esto depende crucialmente de la implementación de RVar y su RandomSource subyacente, en principio uno pensaría que esto implicaría extraer una nueva semilla aleatoria para cada hilo engendrado y continuar como de costumbre.

Intuitivamente, parece que esta misma idea podría generalizarse a otras mónadas.

Entonces, mi pregunta es: ¿se podría construir una clase ParallelMonad de mónadas para la cual los efectos se puedan paralelizar de forma segura (presumiblemente habitado por, al menos, RVar )?

¿A qué se podría parecer? ¿Qué otras mónadas podrían habitar en esta clase? ¿Han considerado otros la posibilidad de cómo esto podría funcionar en Repa?

Finalmente, si esta noción de acciones paralelas monádicas no puede generalizarse, ¿alguien ve alguna buena manera de hacer que esto funcione en el caso específico de RVar (donde sería muy útil)? Renunciar a RVar por el paralelismo es una transacción muy difícil.


Probablemente no sea una buena idea hacer esto debido a la naturaleza intrínsecamente secuencial de los PRNG. En su lugar, es posible que desee realizar la transición de su código de la siguiente manera:

  1. Declara una función IO ( main , o lo que sea).
  2. Lee tantos números aleatorios como necesites.
  3. Pase los números (ahora puros) a sus funciones de reparación.