2011-07-05 5 views
36

Estoy interesado en usar OCaml para un proyecto, sin embargo, no estoy seguro de dónde ya están sus capacidades de paralelización. ¿Hay una capacidad para pasar mensajes en OCaml? ¿OCaml puede usar eficientemente más de 1 CPU?¿Cuál es el estado de las capacidades de paralelización de OCaml?

La mayor parte de lo que he leído sobre el tema fue escrito en 2002-2006, y no he visto nada más reciente.

Gracias!

+0

Véase también [esta pregunta relacionada sobre SO] (http://stackoverflow.com/questions/1302272/is-inria-going-to -add-concurrency-primitives-to-ocaml) – huitseeker

Respuesta

21

This 2009 issue del Caml weekly news ("CWN", un compendio de mensajes interesantes de la caml list) muestra que:

  • la official party line on threads and Ocaml no ha cambiado. Una cita notable:

    (...) en general, toda la biblioteca estándar no es segura para subprocesos. Probablemente eso debería indicarse en la documentación para la biblioteca de hilos, pero no tiene mucho sentido documentarlo por módulo de biblioteca estándar. - X. Leroy

    (por cuánto hilos ocaml todavía puede ser útil, ver a remark by the culprit himself in another question on SO)

  • el paradigma más frecuentemente adoptada para el paralelismo se paso de mensajes, y de la nota es de OcamlMPI X. Leroy, proporcionando enlaces para la programación en el estilo SPMD contra MPI standard. The same CWN issue I pointed to above proporciona referencias a ejemplos y numerosos otros proyectos relacionados.

  • otra solución de paso de mensajes es JoCaml, pionero en el nuevo estilo de comunicaciones concurrentes conocido como join calculus. Tenga en cuenta que es compatible con binarios con compiladores OCaml.

  • que no impidieron la confección de un tiempo de ejecución cuyo GC está bien con el paralelismo, sin embargo: vea una discusión de OCAML4MC en this other issue of the CWN.

Hay también:

  • Netmulticore - multi-procesamiento de valores de intercambio OCaml a través de memoria compartida asignada.

  • CamlP3l - compilador para programas paralelos Caml.

  • OCaml-Java - un compilador OCaml que emite el código de bytes de Java


no he seguido las discusiones más recientes sobre Ocaml & programación en paralelo, sin embargo. Me voy de este CW para que otros puedan actualizar lo que menciono. Sería fantástico si esta pregunta pudiera alcanzar el mismo nivel de integridad que the analogous one for Haskell.

+0

¿Dónde encaja https://github.com/ocamllabs/compiler-hacking/wiki/Multicore-OCaml en esta imagen? – unhammer

+0

Seguimiento del estado de Multicore OCaml y su integración en este hilo de reddit https://www.reddit.com/r/ocaml/comments/63hgid/tracking_multicore_progress/ –

8

En la actualidad, el tiempo de ejecución de OCaml no admite ejecutarse en varios núcleos en paralelo, por lo que un solo proceso OCaml no puede aprovechar múltiples núcleos. Es poco probable que esto cambie directamente; la dirección que los desarrolladores de OCaml están más interesados ​​en tomar para un paralelismo incrementado parece permitir que múltiples tiempos de ejecución OCaml se ejecuten en paralelo en un solo proceso; esto permitirá pasar mensajes muy rápido, pero no permitirá que se ejecuten varios hilos en paralelo en una configuración de memoria compartida. El mayor problema es el recolector de basura; Hace algunos años, el equipo experimentó con un GC simultáneo, pero introdujo desaceleraciones inaceptables en el caso de un solo subproceso.

Hay un par de proyectos, concretamente Functory y OCamlnet, que proporcionan un paralelismo multinúcleo feliz mediante el uso de múltiples procesos.

En general, la comunidad OCaml tiende a favorecer los enfoques de paso de mensajes, lo que se puede hacer a través de los límites del proceso (como OCamlnet), sobre el multiproceso de memoria compartida de proceso único. Si su programa se puede dividir en múltiples procesos (¡muchos pueden!), Entonces sí, puede usar múltiples CPU de manera eficiente.

+0

Con respecto al experimento concurrente de GC: ¿Sería posible tener diferentes GC que pudieran "enchufarse"? Tan listo para usar OCaml vendría con el GC no concurrente (como lo hace ahora), con la opción de usar un GC simultáneo si lo necesitara. ¿Sería posible ese escenario? – aneccodeal

+0

@aneccodeal Si los diferentes GC son compatibles con binarios, podría ser posible. Ha sido discutido; No estoy del todo seguro de por qué no se ha hecho, salvo que nadie ha hecho el trabajo y/o no quieren mantener múltiples tiempos de ejecución. –

+0

@MichaelEkstrand El proyecto OC4MC ya limpió la interfaz GC de OCaml para facilitar la creación de más GC. El problema es que la representación de datos de OCaml pone un gran estrés en el GC, por lo que requeriría mucho trabajo obtener un rendimiento comparable de un nuevo GC que hace que todos intenten. –

0

BSMLlib proporciona una interfaz de programación simplificada para la programación paralela a datos en OCaml. Su ejecución equivale al envío de mensajes al estilo BSP, pero es determinista e incluso declarativa para un subconjunto de OCaml. El concepto clave es el 'a par type que corresponde a un vector de valores, uno por proceso.

http://traclifo.univ-orleans.fr/BSML/ http://fr.wikipedia.org/wiki/Bulk_Synchronous_Parallel_ML

Gaétan Hains Universidad Paris-Est

Cuestiones relacionadas