2013-01-07 10 views
8

Domandaforeach% dopar% utilizza l'installazione sequenziale dell'operatore con il cluster PSock?

Ho notato che foreach /% Dopar% esegue sequenziale, non parallelo configurazione di un cluster prima di eseguire operazioni in parallelo. Se ciascun lavoratore richiede un set di dati e impiega N secondi per trasferire il set di dati all'operatore, quindi foreach /% dopar% spende #workers * N seconds di tempo di configurazione. Questo può essere significativo per un numero maggiore di lavoratori o un N ampio (grandi set di dati da trasferire).

La mia domanda è se questo è di progettazione o ci sono alcuni parametri/impostazioni che mi mancano in foreach o forse nella generazione di cluster?

Setup

  • R 2.15.2
  • ultime versioni di foreach/parallelo/doParallel a partire da oggi (1/7/2013)
  • Windows 7 x64

Esempio

library(foreach) 
library(parallel) 
library(doParallel) 

# lots of data 
data = eval(rnorm(100000000)) 

# make cluster/register - creates 6 nodes fairly quickly 
cluster = makePSOCKcluster(6 , outfile = "") 
registerDoParallel(cluster ) 

# fire up Task Manager. Observer that each node recieves data sequentially. 
# When last node gets data, then all nodes process at the same time 
results = foreach(i = 1 : 500) %dopar% 
{ 
    print(data[ i ]) 
    return(data[ i ]) 
} 
+0

La "configurazione sequenziale" è l'unico tipo di comportamento che ho riscontrato senza utilizzare un cluster di memoria condivisa. Se c'è un modo per velocizzarlo senza memoria condivisa, sarei molto interessato anch'io. Tuttavia, poiché 'clusterExport()' (tramite 'clusterCall()') viene eseguito in sequenza, non credo che terrò il respiro fino ad allora. – BenBarnes

+0

Ben - Potresti elaborare? E perdona la mia ignoranza su cose relative al sistema operativo/memoria .... Nell'esempio ci sono 6 processi figli e penso che l'opportunità di inviare dati a loro in parallelo. È possibile che il processo padre acceda solo a quei dati interni in modo sequenziale? – SFun28

+0

Questo è al limite dei miei limiti di conoscenza della comunicazione cluster, ma su sistemi unix-like, si può 'fork' un processo, permettendo ai processi figli di accedere agli oggetti caricati nel processo genitore, copiando solo quelli modificati. Le macchine Windows non hanno questa particolare capacità e, con tutti i tipi di cluster che ho usato (che è ** non ** tutto), l'installazione del cluster è avvenuta in sequenza. – BenBarnes

risposta

3

Grazie a Rich in Rivoluzione Informatica per aiutare con questo ....

clusterCall utilizza un ciclo for per inviare i dati a ciascun lavoratore. Poiché R non è multi-thread, il ciclo for deve essere sequenziale.

Esistono alcune soluzioni (che richiederebbero a qualcuno di codificarle). R potrebbe chiamare C/C++ per eseguire il threading della configurazione worker. O i lavoratori potrebbero estrarre i dati da un file su disco. Oppure i lavoratori potevano ascoltare sullo stesso socket e il master poteva scrivere sul socket solo una volta e trasmettere i dati a tutti i lavoratori.

+0

Grazie per aver postato la risposta !! – BenBarnes

Problemi correlati