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
MPI: Cliente (Haskell) < - MPI -> Broker (C++) < - - MPI -> Worker (C++) < -> Lib (C++)
ZeroMQ: Cliente (Haskell) < - ZeroMQ -> Broker (C++) < - ZeroMQ -> Trabajador (C++) < -> Lib (C++)
Nube Haskell: Cliente (Haskell) < - CloudHaskell - > Worker (Haskell) < - FFI -> Lib (C++)
Gearman
Erlang: Cliente (Haskell) < - Erlang -> Broker (Erlang) < - - Erlang CN ode -> Trabajador (C++)
Cada enfoque tiene ventajas y desventajas.
MPI creará una gran cantidad de problemas de seguridad y es una solución bastante pesada.
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).
CloudHaskell no se ve muy maduro.
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.).
Similar a 1 y requiere el uso de un tercer idioma.
Gracias!
¿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? –
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
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 :) –