2013-03-04 11 views
6

Sto sperimentando un comportamento strano nel mio computer quando distribuisco processi tra i suoi core usando doMC e foreach. Qualcuno sa perché utilizzando single core ho ottenuto prestazioni migliori rispetto all'utilizzo di 2 core? Come potete vedere, l'elaborazione dello stesso codice senza registrare alcun core (che presumibilmente usa solo 1 core) produce un'elaborazione molto più rapida. Mentre% do% sembra funzionare meglio di% dopar%, registrando 2 core su 4 di resa a più tempo.Parallelizzazione in R:% dopar% vs% do%. Perché utilizzare un rendimento single core per prestazioni migliori?

require(foreach) 
require(doMC) 
# 1-core 
> system.time(m <- foreach(i=1:100) %dopar% 
+ matrix(rnorm(1000*1000), ncol=5000)) 
    user system elapsed 
    9.285 1.895 11.083 
> system.time(m <- foreach(i=1:100) %do% 
+ matrix(rnorm(1000*1000), ncol=5000)) 
    user system elapsed 
    9.139 1.879 10.979 

# 2-core 
> registerDoMC(cores=2) 
> system.time(m <- foreach(i=1:100) %dopar% 
+ matrix(rnorm(1000*1000), ncol=5000)) 
    user system elapsed 
    3.322 3.737 132.027 
> system.time(m <- foreach(i=1:100) %do% 
+ matrix(rnorm(1000*1000), ncol=5000)) 
    user system elapsed 
    9.744 2.054 11.740 

Utilizzando 4 core in alcune prove rendimento a risultati molto diversi:

> registerDoMC(cores=4) 
> system.time(m <- foreach(i=1:100) %dopar% 
{ matrix(rnorm(1000*1000), ncol=5000) }) 
    user system elapsed 
11.522 4.082 24.444 
> system.time(m <- foreach(i=1:100) %dopar% 
{ matrix(rnorm(1000*1000), ncol=5000) }) 
    user system elapsed 
21.388 6.299 25.437 
> system.time(m <- foreach(i=1:100) %dopar% 
{ matrix(rnorm(1000*1000), ncol=5000) }) 
    user system elapsed 
17.439 5.250 9.300 
> system.time(m <- foreach(i=1:100) %dopar% 
{ matrix(rnorm(1000*1000), ncol=5000) }) 
    user system elapsed 
17.480 5.264 9.170 
+1

1. La produzione di una singola matrice non è (in generale) eseguita in parallelo, a meno che non si definisca come deve essere fatto, e non lo si è fatto. Dovresti aspettarti risultati peggiori quando usi più di un core. 2. Il comando 'registerDoMC' influisce su'% do% '? I risultati sono simili. –

+0

@MatthewLundberg: Si prega di '% do%' controllare la documentazione :-) – krlmlr

+0

A meno che non legga l'output in modo errato, non vedo _ "molto più elaborazione dell'efficienza temporale" _, sembra una differenza trascurabile di appena l'1,5% –

risposta

8

È la combinazione dei risultati che mangia tutto il tempo di elaborazione. Questi sono i tempi sul mio computer per lo scenario cores=2 se non vengono restituiti risultati. È essenzialmente lo stesso codice, solo le matrici creati vengono scartati anziché essere restituito:

> system.time(m <- foreach(i=1:100) %do% 
+ { matrix(rnorm(1000*1000), ncol=5000); NULL }) 
    user system elapsed 
13.793 0.376 14.197 
> system.time(m <- foreach(i=1:100) %dopar% 
+ { matrix(rnorm(1000*1000), ncol=5000); NULL }) 
    user system elapsed 
    8.057 5.236 9.970 

Ancora non ottimale, ma almeno la versione parallela è ora più veloce.

Questo è da documentazione di doMC:

Il pacchetto doMC fornisce un backend parallelo per la funzione foreach/%dopar% utilizzando la funzionalità multicore del pacchetto parallel.

Ora, parallel utilizza un meccanismo fork per generare copie identiche del processo R. Raccogliere risultati da processi separati è un compito costoso, ed è ciò che vedi nelle tue misurazioni del tempo.

+1

Sì, hai ragione. Il mio codice era sbagliato non distribuendo i processi. Ora, il comportamento è come mi aspettavo. Grazie per aver segnalato il mio errore. – daniel

+1

@ user792000: Erm, no. Anche i processi sono stati distribuiti nel tuo codice. L'unica differenza è che il tuo codice * restituisce * le matrici che genera, il mio codice le elimina. – krlmlr

+0

È davvero strano. L'utilizzo di 4 core in pochi studi porta a risultati molto diversi: – daniel

Problemi correlati