2012-05-12 7 views
6

Tengo una biblioteca compartida C++ de libre acceso y sin hilos que proporciona una función f :: ByteString -> ByteString. El tiempo de ejecución de esta función puede ser algo entre un segundo y un par de horas.Marco de Haskell para paralelizar C++ lib no con hilos de rosca

Busco una forma de distribuir el cálculo de múltiples núcleos/servidores (SIMD).

En pocas palabras, estoy buscando un marco que proporciona una función de

g :: Strategy b -> (a -> b) -> a -> b 

para levantar una función que sólo se puede llamar de forma secuencial en una función que se comporta como cualquier otra función pura en Haskell.

Por ejemplo, yo quiero ser capaz de escribir:

parMap rwhnf f args -- will not work 

Desde f llama a una función C en un lib no seguro para subprocesos a través de FFI, esto no funcionará. Por lo tanto, podría reemplazar la función f con una función g que contenga una cola de trabajos y envíe las tareas a N procesos separados. Los procesos pueden ejecutarse de forma local o distribuido:

parMap rwhnf g args -- should works 

marcos potenciales Ya análisis son la

  1. MPI: Cliente (Haskell) < - MPI -> Broker (C++) < - - MPI -> Worker (C++) < -> Lib (C++)

  2. ZeroMQ: Cliente (Haskell) < - ZeroMQ -> Broker (C++) < - ZeroMQ -> Trabajador (C++) < -> Lib (C++)

  3. Nube Haskell: Cliente (Haskell) < - CloudHaskell - > Worker (Haskell) < - FFI -> Lib (C++)

  4. Gearman

  5. Erlang: Cliente (Haskell) < - Erlang -> Broker (Erlang) < - - Erlang CN ode -> Trabajador (C++)

Cada enfoque tiene ventajas y desventajas.

  1. MPI creará una gran cantidad de problemas de seguridad y es una solución bastante pesada.

  2. ZeroMQ es una buena solución pero requeriría que escribiera el corrector/equilibrador de carga, etc. solo (especialmente obtener la fiabilidad correcta no es trivial).

  3. CloudHaskell no se ve muy maduro.

  4. Gearman no funciona en Windows y no tiene enlaces Haskell.Sé sobre el servicio Java-Gearman pero es mucho menos maduro que el daemon C y tiene otros problemas (por ejemplo, no hay documentación, se apaga si no hay un flujo de tareas entrantes durante un tiempo, etc.).

  5. Similar a 1 y requiere el uso de un tercer idioma.

Gracias!

+0

¿Está buscando la posibilidad de distribuir una función que funcione con los mismos datos en varios núcleos para que sea segura? Si no, ¿cómo puede paralelizarse su función de fuente cerrada? –

+0

Estoy buscando una solución SIMD. La fuente cerrada significa que no puedo hacer ninguna modificación a la lib para que sea segura para subprocesos. Por lo tanto, tendré que ejecutar cada llamada de función en un proceso separado. Lo que estoy buscando es una solución simple para equilibrar la carga/conectar los procesos. En Scala usaría Akka con los trabajadores como nodos remotos que se ejecutan en una JVM separada. – Chronos

+1

ah, ¿así que quieres calcular la función varias veces en diferentes entradas? esto no está del todo claro por su pregunta, es posible que desee editar las primeras dos oraciones para mencionarlo :) –

Respuesta

1

Dado que la biblioteca que está utilizando no es segura para subprocesos, le gustaría una solución basada en el uso de procesos como su abstracción para el paralelismo. El ejemplo que le gustaría ver usando la mónada Par usa el modelo de paralelismo basado en chispa o tarea en el que muchas chispas pueden vivir en el mismo hilo. Claramente, esto no es lo que estás buscando.

Fear Not!

Existen solo unos pocos paradigmas en Haskell que funcionan de esta manera y usted mencionó uno de ellos en su publicación, Cloud Haskell. Aunque Cloud Haskell no es "maduro", podría resolver tus problemas, pero puede ser un poco pesado para tus necesidades. Si realmente sólo tiene que tomar ventaja de muchos núcleos locales utilizando la abstracción nivel de proceso en paralelo a continuación, busque en la biblioteca Edén:

http://www.mathematik.uni-marburg.de/~eden/

Con Edén pesar de todo puede expresar lo que está después. Aquí está un ejemplo muy sencillo lo largo de las líneas de su versión basada Par Mónada:

f $# args 

O en el caso de muchos argumentos que sólo podría sacar los ye un mapa Olde:

map f $# args 

Para obtener más información acerca de el $ # sintaxis y tutoriales sobre Eden ver:

http://www.mathematik.uni-marburg.de/~eden/paper/edenCEFP.pdf

tu caso es distinto ya que la mayoría de los paradigmas paralelos más maduros en Haskell que asuma ja Tiene un nivel de seguridad de subprocesos o que el uso puede hacer el trabajo paralelo de una manera pura.

¡Buena suerte y feliz piratería!

+0

Genial - ¡Gracias! Echaré un vistazo. – Chronos