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 ])
}
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
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
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