2012-02-22 17 views
24

Deseo implementar mi algoritmo de filtrado de partículas en paralelo en Common Lisp. El filtrado de partículas y el muestreo se pueden paralelizar y quiero hacer esto para mi máquina de 4 núcleos. Mi pregunta es si la programación en paralelo es factible en CL o no y si es factible hay buenas lecturas, tutoriales sobre cómo comenzar a computación en paralelo en CL.Programación de Common Lisp Parallel

Respuesta

26

¡Definitivamente factible!

El Bordeaux Threads project proporciona primitivas de subprocesos para una serie de implementaciones; Sugeriría usarlo en lugar de las primitivas específicas de implementación de SBCL (¡especialmente si no está en SBCL!).

Las primitivas de hilo proporcionadas por bt son, sin embargo, bastante primitivas. He usado y disfrutado Eager Future2 que se basa en bt para proporcionar características de concurrencia utilizando futuros. Puede crear futuros que se calculan de forma perezosa, con entusiasmo (inmediatamente) o especulativamente. Los futuros especulativos se calculan mediante un grupo de subprocesos cuyo tamaño se puede personalizar.

Comencé a little project para proporcionar versiones paralelas de funciones de CL utilizando EF2, pero hasta ahora solo se trata de tres funciones, por lo que no será de mucha utilidad para nadie. Por supuesto, doy la bienvenida a otros codificadores para que la pirateen y envíen solicitudes de extracción, y espero trabajar más en ello en el futuro.

Hay muchas otras bibliotecas listed on Cliki que no he probado.

En cuanto a los tutoriales, no conozco ninguno, pero las características de simultaneidad proporcionadas también se encuentran en otros idiomas y los buenos algoritmos y prácticas no son generalmente específicos del idioma.

Si le interesa leer un libro, le recomiendo El lenguaje de programación simultánea C. Los autores describen un nuevo lenguaje de programación, basado en C, con concurrencia como característica del lenguaje. Por supuesto, debido a la naturaleza de CL, probablemente sería posible implementar estas características sin recurrir a la creación de un nuevo compilador. En mi opinión, el libro presenta excelentes conceptos de concurrencia y aborda muchos de los problemas que puede encontrar o no tener en cuenta al escribir programas concurrentes.

+2

También recomiendo PCALL (http://marijnhaverbeke.nl/pcall/) - una muy simple, pero biblioteca útil para organizar cálculos paralelos (la mayoría) independientes. –

+0

EF2 es una bifurcación de PCall. No he usado PCall yo mismo. –

+5

lparallel (http://lparallel.org/) es una gran biblioteca de programación paralela, canales de apoyo, futuros y más. También tiene una biblioteca de hermanos (que usa la misma API) - lfarm, que permite la computación distribuida. –

8

SBCL tiene compatibilidad con subprocesos múltiples. Es un nivel demasiado bajo y, que yo sepa, no incluye ningún algoritmo paralelo. Tiene la posibilidad de crear subprocesos que ejecutan alguna función lambda y luego probar si el hilo ha terminado (uniéndose a él). Utilicé ese soporte para generar las páginas de mi blog con gran velocidad (cada página o conjunto de páginas en un hilo diferente). Se puede ver el código aquí:

https://github.com/dsevilla/functional-mind-blog/blob/master/blog/process.lisp

Para eample, generando un hilo para cada página fue algo así como:

#+sbcl 
(defun generate-post-pages() 
    (map nil 
     #'(lambda (post) 
      (make-thread (lambda() (page-generation-function post)))) 
     *posts*)) 

También puede join-thread, y tienen exclusiones mutuas, etc Usted puede leer la documentación aquí: SBCL Threading. Aunque es de muy bajo nivel. Usted terminará perdiendo las características fantásticas de Clojure para la concurrencia ...

4

Eche un vistazo a los subprocesos bordeaux si está buscando una interfaz de estilo POSIX-hilos única para primitivas multi-subprocesamiento para diferentes Lisps.

Si estuviera buscando una implementación de Lisp gratuita y confiable, comenzaría con CCL y luego probaría SBCL. Uso CCL para casi todas mis pruebas y SBCL y LispWorks para el resto.

La biblioteca de futuros de Sedach debe proporcionar una interfaz de nivel superior. También hay algunas otras contribuciones de varios usuarios en el directorio contrib de SBCL.

Esto viene de alguien que no ha usado ni los hilos de bordeaux ni la biblioteca de futuros de Sedach y ha escrito su propia versión de ambos. Podría enviarte mi implementación, pero se supone que estos dos paquetes también son buenos y probablemente sean un mejor punto de partida.

3

LispWorks 6 viene con un buen conjunto de primitivas para la programación simultánea.

Tenga en cuenta que, según mi conocimiento ninguno de las implementaciones de Common Lisp habituales tiene un recolector de basura concurrente.

Documentación para LispWorks 6 y multiprocesamiento