13

¿Hay una implementación del esquema R5RS o superior que tenga paralelización? Por ejemplo, si digo que hacer:¿Hay una implementación de esquema que se paralelice?

(map (lambda (x) 
     (pure-functional-stuff x)) 
    '(1 3 5 7 11 13)) 

procesará 1, 3, 5, 7 y simultáneamente si la máquina puede hacerlo? Se supone que es una de las grandes ventajas de la programación funcional, pero no puedo encontrar un esquema actualizado y actualizado que lo haga. Estaría bien con uno que no lo paralelice a menos que afirme que la función no tiene efectos secundarios.

+1

La paralelización automática todavía se ve raramente. Si algunos entusiastas de la FP dicen que los programas de lenguaje FP son 'mejores para paralelizar', entonces él/ella probablemente quiere decir 'tú', el programador. –

Respuesta

5

Soy un desarrollador de Schemik y creo que es el Esquema que está buscando. El proyecto aún está desarrollado y mantenido. A principios de este año, lancé una versión que mejora la compatibilidad con R5RS. Desafortunadamente, Schemik es un proyecto de investigación centrado en el proceso de evaluación de la expresión, por lo tanto, su biblioteca estándar es todavía relativamente pequeña. ¿Hay alguna funcionalidad particular que te pierdas en Schemik?

+0

Estoy investigando ahora. Todavía no lo sé con certeza, pero parece prometedor. – JasonFruit

+0

Hace lo que necesito por ahora --- ¡gracias! He querido probar algo que funciona de esta manera. – JasonFruit

2

me acaba de encontrar Schemik

http://schemik.sourceforge.net/

el que parece mantenerse por lo menos a 2009, aunque no sé si es R5RS.

+0

Me confunde que dice ser un "dialecto de Scheme y Common Lisp". ¿Significan, "un dialecto de Lisp"? – JasonFruit

+0

Se acerca al R5RS, aunque tuve que profundizar en los comentarios de compromiso para descubrirlo. Gravemente infravalorado, como un todo, y tiene un factor de bus de 1, pero tiene potencial. – JasonFruit

3

Racket tiene futures que hace algo muy similar a esto, y también tendrá un segundo enfoque para el paralelismo en el futuro cercano (que se llamará "lugares").

+0

Leeré el futuro de Racket. No los había notado. – JasonFruit

3

Resulta que usted realmente no quiere que el compilador para tratar de paralelizar todo porque entonces se termina perdiendo los esfuerzos de coordinación de tiempo, incluso cuando se hace algo tan simple como,

(map add1 '(1 2 3)) 

que sería más rápido solo hacer en un hilo. Sin embargo, muchos lenguajes funcionales en estos días le facilitan hacer esto en paralelo cuando "add1" es en realidad "realmente-largo-computación". Cada idioma tiene su propio enfoque, pero recomendaría aprovechar varios núcleos en Racket utilizando futuros.

Si bien el compilador decide las cosas automáticamente para usted es bueno, no es una mala compensación cambiar un "mapa" a un "pmap" donde cree que podría ayudar en lugar de lidiar con ralentizaciones en otros lugares porque el compilador también ambicioso.

Algo tan básico como

(define (pmap f xs) 
    (map touch (map (λ(x) (future (λ() (f x)))) xs))) 

se puede obtener bastante lejos cuando se usa con prudencia, pero se debe experimentar con fragmentación de seguridad de datos para alimentar a paralelo hilos.

Cuestiones relacionadas