2010-09-17 4 views
6

Sembra il clojure will have a fork-join implementation che sembra un wrapper funzionale rispetto al framework fork di java.clojure pmap/preduce vs fork-join

Mi chiedo quale potrebbe essere la differenza tra questi e pmap/predurre?

+0

questo sta per essere un argomento di un discorso alla conferenza Clojure-conj: http://clojure-conj.org/speakers#liebke David liebke ora sta lavorando attivamente su di esso per la prossima versione di clojure –

+0

@Alex che l'abstract è ciò che ha spinto questa domanda :). – Surya

+0

Qualche idea viene data a una strategia di implementazione per fork-join su ClojureCLR o, in generale, per garantire che l'API fork-join sia amichevole con implementazioni alternative? –

risposta

3

Il fork-join è più generale di quello basato su sequenza pmap/preduce e dovrebbe consentire un controllo più dettagliato del parallelismo. Le API esatte per fare ciò sono ancora nell'aria.

2

Dall'esame di quel codice, la loro funzionalità sarà per lo più la stessa: l'unica differenza è che pmap utilizza Futures in esecuzione sul threadfile Agent come primitiva sottostante, mentre pvmap utilizza fork-join.

Non sono in grado di dirlo con certezza, ma mi aspetterei che qualunque sia il rendimento migliore nel caso generale diventerebbe l'implementazione standard per pmap, a meno che non vi siano compromessi abbastanza significativi da rendere entrambi utili.

Sembra anche (per ora almeno) il framework fork-join supporta solo i vettori, quindi non è semi-pigro come pmap.

1

Una differenza, per quanto ho capito, è che pmap verrà eseguito solo in qualsiasi grado di "chunkiness" è dato. La funzione è mappata su ciascun membro della sequenza data a pmap. Se la granularità è troppo piccola, i potenziali benefici del parallelismo vengono inghiottiti dal sovraccarico di creazione e gestione di troppi Future s.

Il fork-join consente il furto del lavoro in modo che la quantità di corsa su ciascuna filettatura possa essere adattabile.

1

Né pmap né pvmap ci salveranno dal dover utilizzare la dimensione del blocco corretto. Per i miei progetti, in genere, si tratta di suddividere i dati in blocchi e di utilizzare la mappa su ogni blocco, quindi di utilizzare pmap per mappare i blocchi in parallelo. quindi ridurre e appiattire.