2015-03-03 14 views
9

Qual è la differenza tra cluster e core in registerDoParallel quando si utilizza il pacchetto doParallel?doParallel, cluster vs core

è la mia comprensione corretta che in un'unica macchina queste sono intercambiabili e mi metterò stessi risultati per:

cl <- makeCluster(4) 
registerDoParallel(cl)  

e

registerDoParallel(cores = 4) 

L'unica differenza vedo che makeCluster() deve essere fermato in modo esplicito utilizzando stopCluster().

+0

Non sicuro, ma suppongo che sarai fisicamente limitato dal numero di core, ma non dal numero di cluster, cioè il numero di "copie di R in esecuzione in parallelo e che comunicano su socket". Ovviamente, i cluster potrebbero potenzialmente condividere lo stesso core, a seconda del numero di rapporti di cluster/numero di core. –

+1

Sono tendenzialmente d'accordo con @Pascal e che non c'è differenza su una singola macchina, al di fuori di provare effettivamente cosa si può ottenere e come funzionano le cose. Se vuoi solo parallelizzare del codice, allora non dovrebbe importare in alcun modo. – LauriK

risposta

5

Sì, è giusto dalla visualizzazione software.

su una singola macchina sono intercambiabili e otterrò gli stessi risultati.


Per capire 'grappolo' e 'core' in modo chiaro, vi suggerisco di pensare dal livello del 'software' 'hardware' e.

A livello di hardware, "cluster" indica le macchine connesse alla rete che possono funzionare insieme tramite comunicazioni come da socket (sono necessarie più operazioni di inizializzazione/arresto come stopCluster indicato). Mentre 'core' significa diversi core hardware nella CPU locale e lavorano insieme in base alla memoria condivisa in genere (non è necessario inviare messaggi esplicitamente da A a B).

A livello di software, a volte il limite di cluster e cores non è chiaro. Il programma può essere eseguito in locale da core o remoto da cluster, e il software di alto livello non ha bisogno di conoscere i dettagli. Quindi, possiamo mixare due modalità come l'uso della comunicazione esplicita in locale come impostazione cl in una macchina, e anche eseguire multicorpi su ciascuna macchina remota.


Torna alla tua domanda, è l'impostazione cl o cores uguali?

Dal software, sarà lo stesso che il programma verrà eseguito dallo stesso numero di client/server e quindi ottenere gli stessi risultati.

Dall'hardware, potrebbe essere diverso. cl significa comunicare esplicitamente e cores alla memoria condivisa, ma se il software di alto livello ottimizzato molto bene. Nella macchina locale, entrambe le impostazioni andranno nello stesso flusso. Ora non approfondisco lo studio doParallel molto profondo, quindi non sono molto sicuro se questi due sono uguali.

Ma in pratica, è meglio specificare cores per singola macchina e cl per il cluster.

Spero che questo aiuto per voi.

+0

Questo è troppo generale. La domanda dell'OP è una domanda specifica sul pacchetto doParallel, non una questione di concetto generale. Per questa domanda, si tratta più di implementazioni della piattaforma e sono diverse anche per una singola macchina. – dracodoc

1

Penso che la risposta scelta sia troppo generica e in realtà non accurata, poiché non ha toccato il dettaglio del pacchetto doParallel stesso. Se leggi le vignette, in realtà è abbastanza chiaro.

Il pacchetto parallelo è essenzialmente una fusione del pacchetto multicore , scritto da Simon Urbanek, e il pacchetto neve, che è stato scritto da Luca Tierney e altri. La funzionalità multicore supporta più worker solo su quelli che utilizzano i sistemi che supportano la chiamata del sistema fork; questo esclude Windows. Con il valore predefinito , doParallel utilizza la funzionalità multicore su sistemi Unix e funzionalità neve su Windows.

Useremo la funzionalità di neve come in questa vignetta, quindi iniziare caricamento del pacchetto e l'avvio di un cluster

utilizzare la funzionalità multicore-like, si precisa il numero di core da usare al posto

In sintesi, dipende dal sistema. Cluster è la modalità più generale che copre tutte le piattaforme, e core è solo per un sistema unix-like.

Per rendere l'interfaccia coerente, il pacchetto ha utilizzato la stessa funzione per queste due modalità.

> library(doParallel) 
> cl <- makeCluster(4) 
> registerDoParallel(cl) 
> getDoParName() 
[1] "doParallelSNOW" 

> registerDoParallel(cores=4) 
> getDoParName() 
[1] "doParallelMC" 
3

Il comportamento di doParallel::registerDoParallel(<numeric>) dipende dal sistema operativo, vedere print(doParallel::registerDoParallel) per i dettagli.

su macchine Windows,

doParallel::registerDoParallel(4) 

fa in modo efficace

cl <- makeCluster(4) 
doParallel::registerDoParallel(cl) 

vale a dire da esso istituito quattro operai ("PSOCK") che vengono eseguiti in background sessioni R. Quindi, %dopar% utilizzerà fondamentalmente il macchinario parallel::parLapply(). Con questa configurazione, devi preoccuparti delle variabili globali e dei pacchetti che sono collegati a ciascuno dei lavoratori.

Tuttavia, su macchine non-Windows,

doParallel::registerDoParallel(4) 

il risultato sarà che %dopar% utilizzerà la macchina parallel::mclapply(), che a sua volta si basa su biforcuta processi. Poiché si utilizza il biforcazione, non è necessario preoccuparsi di globali e pacchetti.

Problemi correlati