13

Esiste un'implementazione di schema R5RS o superiore che esegue la parallelizzazione? Ad esempio, se dico fare:Esiste un'implementazione Schema parallela?

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

processerà 1, 3, 5, 7 e simultaneamente se la macchina può farlo? Questo dovrebbe essere uno dei grandi vantaggi della programmazione funzionale, ma non riesco a trovare uno Schema aggiornato e aggiornato che lo faccia. Sarei perfetto con uno che non sarebbe parallelo a meno che non asserisca che la funzione non ha effetti collaterali.

+1

La parallelizzazione automatica è ancora rara. Se alcuni appassionati di FP dicono che i programmi in linguaggio FP sono "meglio parallelizzare", allora probabilmente intende per "voi", il programmatore. –

risposta

5

Sono uno sviluppatore di Schemik e penso che sia lo schema che stai cercando. Il progetto è ancora sviluppato e mantenuto. All'inizio di quest'anno, ho rilasciato una versione che migliora la compatibilità con R5RS. Sfortunatamente, Schemik è un progetto di ricerca incentrato sul processo di valutazione dell'espressione, quindi la sua libreria standard è ancora relativamente piccola. C'è qualche particolare funzionalità che ti manca in Schemik?

+0

Sto scavando dentro adesso. Non ne sono ancora sicuro, ma sembra promettente. – JasonFruit

+0

Fa quello che mi serve per ora --- grazie! Volevo provare qualcosa che funzioni in questo modo. – JasonFruit

2

Ho appena trovato Schemik

http://schemik.sourceforge.net/

che sembra essere mantenuta ad almeno 2.009, anche se non so se è R5RS.

+0

Mi confonde che afferma di essere un "dialetto di Scheme e Common Lisp". Intendono, "un dialetto di Lisp"? – JasonFruit

+0

Si avvicina a R5RS, anche se ho dovuto scavare attraverso i commenti di commit per scoprirlo. Seriamente poco documentato, nel suo complesso, e ha un fattore di bus pari a 1, ma ha un potenziale. – JasonFruit

3

Racket ha futures che fa qualcosa di molto simile a questo, e avrà anche un secondo approccio per il parallelismo nel prossimo futuro (che sarà chiamato "luoghi").

+0

Leggerò il futuro di Racket. Non li avevo notati. – JasonFruit

3

Si scopre che non si vuole veramente il compilatore per cercare di parallelizzare tutto perché poi si finisce per sprecare tempo coordinare gli sforzi, anche quando si fa qualcosa di semplice come,

(map add1 '(1 2 3)) 

che sarebbe più veloce da fare solo su un thread. Tuttavia, molti linguaggi funzionali in questi giorni rendono facile per voi fare questo parallelo quando "add1" è in realtà "calcolo veramente lungo". Ogni lingua ha il suo approccio, ma io raccomanderei di sfruttare i core multipli in Racket usando i futures.

Mentre il compilatore di decidere le cose automaticamente per voi è bello, non è un cattivo compromesso per cambiare una "mappa" ad un "pmap" in cui si pensa che potrebbe aiutare piuttosto che affrontare rallentamenti in altri luoghi perché il compilatore era troppo ambizioso.

qualcosa di base come

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

si può ottenere abbastanza lontano se usato con giudizio, ma si dovrebbe sperimentare con la suddivisione in blocchi il backup dei dati per alimentare a thread paralleli.