86 votos

Paralelo de la mamp en Repa matrices

En mi reciente trabajo con Gibbs sampling, he estado haciendo un gran uso de la RVar que, en mi punto de vista, ofrece un ideal cerca de interfaz para la generación de números aleatorios. Tristemente, he sido incapaz de hacer uso de Repa debido a la incapacidad para utilizar monádico acciones en los mapas.

Aunque claramente monádico mapas no puede ser paralelizado, en general, a mí me parece que RVar puede ser al menos un ejemplo de una mónada en el que los efectos pueden ser de forma segura paralelo (al menos en principio, yo no estoy muy familiarizado con el funcionamiento interno de RVar). Es decir, 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 como,

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

Aunque claramente cómo funcionaría este depende fundamentalmente de la aplicación de RVar y la subyacente RandomSource, en principio uno podría pensar que esto implicaría el dibujo de un nuevo número aleatorio para cada subproceso generado y proceder como de costumbre.

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

Así, mi pregunta es: se Podría construir una clase ParallelMonad de mónadas para que los efectos pueden ser de forma segura paralelizado (presumiblemente habitadas por, al menos, RVar)?

¿Qué podría ser? ¿Qué otras mónadas posible que habitan en esta clase? Otros consideran la posibilidad de cómo podría funcionar esto en Repa?

Por último, si esta noción de paralelo monádico acciones no puede ser generalizado, ¿alguien ve alguna buena manera de hacer este trabajo en el caso específico de RVar (en la que sería muy útil)? Dando RVar para el paralelismo es muy difícil trade-off.

4voto

mcandre Puntos 6965

Probablemente no es una buena idea hacer esto debido a la naturaleza inherentemente secuenciales de PRNGs. En su lugar, usted puede ser que desee para la transición de su código como sigue:

  1. Declarar un IO de la función (main, o lo que sea).
  2. Leer tantos números aleatorios como usted necesita.
  3. Pase de la (pura) números en su repa funciones.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X