2016-06-15 39 views
12

Come afferma il titolo: qual è esattamente la differenza tra @parallel e pmap? Non intendo che l'ovvio sia una macro per un ciclo e l'altro funzioni sulle funzioni, intendo esattamente come differisce la loro implementazione e come dovrei usare questa conoscenza per scegliere tra loro?Qual è esattamente la differenza tra @parallel e pmap?

Il motivo che mi chiedo è che molte delle applicazioni che scrivo potrebbe utilizzare costruire: Potrei scrivere un ciclo e calcolare qualcosa con @parallel, o avvolgere quello che sarebbe stato in loop in una funzione e chiamare pmap su quella . Ho seguito il consiglio di usare @parallel per cose che sono veloci da valutare e pmap per le chiamate in cui ogni attività richiede molto più tempo (come afferma nella documentazione), ma sento che se ho una migliore comprensione di ciò che sta facendo io essere in grado di fare scelte migliori

Ad esempio: lo @parallel divide il lavoro prima di valutare? Ho notato che se eseguo un ciclo parallelo in cui ogni chiamata interna richiede una quantità casuale di tempo, lo @parallel può richiedere molto tempo perché alla fine ho ancora pochissimi processi ancora funzionanti. pmap sulla stessa microtest non sembra avere questo: è pmap ridistribuire il lavoro come necessario?

Altre domande come queste derivano dalla mia ignoranza su cosa esattamente comedifferisce da @parallel.

risposta

13

@parallel prenderà i lavori da fare e li dividerà tra i lavoratori disponibili subito. Nota nello [email protected] otteniamo The specified range is partitioned ... across all workers.pmap, al contrario, inizieranno ogni lavoratore su un lavoro. Una volta che un lavoratore finisce con un lavoro, gli darà il prossimo lavoro disponibile. È simile alla multiprocessing basata sulla coda, come è comune in Python, ad esempio. Quindi, non è tanto un caso di "ridistribuzione" del lavoro, quanto piuttosto di darlo solo al momento giusto e al lavoratore giusto in primo luogo.

Ho preparato il seguente esempio che, a mio avviso, lo illustra. In questo esempio un po 'sciocco, abbiamo due lavoratori, uno dei quali è lento e l'altro è due volte più veloce. Idealmente, vorremmo dare al lavoratore veloce il doppio del lavoro del lavoratore lento. (o, più realisticamente, avremmo lavori veloci e lenti, ma il principale è esattamente lo stesso). pmap compirà questo, ma non lo sarà il @parallel.

Per ogni test, ho inizializzare le seguenti:

addprocs(2) 

@everywhere begin 
    function parallel_func(idx) 
     workernum = myid() - 1 
     sleep(workernum) 
     println("job $idx") 
    end 
end 

Ora, per il test @parallel, corro il seguente:

@parallel for idx = 1:12 
    parallel_func(idx) 
end 

e tornare output di stampa:

julia> From worker 2: job 1 
    From worker 3: job 7 
    From worker 2: job 2 
    From worker 2: job 3 
    From worker 3: job 8 
    From worker 2: job 4 
    From worker 2: job 5 
    From worker 3: job 9 
    From worker 2: job 6 
    From worker 3: job 10 
    From worker 3: job 11 
    From worker 3: job 12 

È quasi dolce. I lavoratori hanno "condiviso" il lavoro in modo uniforme. Nota che ogni lavoratore ha completato 6 lavori, anche se il lavoratore 2 è due volte più veloce del lavoratore 3. Può essere toccante, ma non è efficiente.

Per per il test pmap, corro il seguente:

pmap(parallel_func, 1:12) 

e ottenere l'output:

From worker 2: job 1 
From worker 3: job 2 
From worker 2: job 3 
From worker 2: job 5 
From worker 3: job 4 
From worker 2: job 6 
From worker 2: job 8 
From worker 3: job 7 
From worker 2: job 9 
From worker 2: job 11 
From worker 3: job 10 
From worker 2: job 12 

Ora, si noti che operaio 2 ha eseguito 8 posti di lavoro e dei lavoratori 3 è esibito 4 Questo è esattamente in proporzione alla loro velocità, e ciò che vogliamo per l'efficienza ottimale. pmap è un master per compiti difficili, da ciascuno secondo le proprie capacità.

Pertanto, le raccomandazioni nella documentazione di Julia hanno senso. Se hai piccoli lavori semplici, è più probabile che questi problemi con @parallel non causino problemi. Per i lavori più grandi o più complessi, tuttavia, pmap presenta vantaggi.