2014-06-10 8 views
5

Ho un caso in cui foreach utilizza doMC come un backend produce comportamenti diversi su macchine diverse.R per non utilizzare più core

Su un server Linux con Ubuntu 12.04.4 LTS il seguente codice (adattato da foreach vingette) esegue 5 processi contemporaneamente su un singolo core, che non è il comportamento desiderato.

library(foreach) 
library(doMC) 

registerDoMC(cores=5) 
getDoParWorkers() 

x <- iris[which(iris[,5] != "setosa"), c(1,5)] 
trials <- 10000 
r <- foreach(icount(trials), .combine=cbind) %dopar% { 
    ind <- sample(100, 100, replace=TRUE) 
    result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit)) 
    coefficients(result1) 
} 

informazioni Sessione:

> sessionInfo() 
R version 3.1.0 (2014-04-10) 
Platform: x86_64-pc-linux-gnu (64-bit) 

locale: 
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C   LC_TIME=C   LC_COLLATE=C   LC_MONETARY=C  
[6] LC_MESSAGES=C  LC_PAPER=C   LC_NAME=C   LC_ADDRESS=C   LC_TELEPHONE=C  
[11] LC_MEASUREMENT=C  LC_IDENTIFICATION=C 

attached base packages: 
[1] parallel stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] doMC_1.3.3  iterators_1.0.7 foreach_1.4.2 

loaded via a namespace (and not attached): 
[1] codetools_0.2-8 compiler_3.1.0 tools_3.1.0 

La stessa corsa codice su un Mac con OSX 10.7.5 produce il comportamento desiderato e atteso di correre 5 posti di lavoro su 5 diversi nuclei.

informazioni Sessione:

> sessionInfo() 
R version 3.0.1 (2013-05-16) 
Platform: x86_64-apple-darwin10.8.0 (64-bit) 

locale: 
[1] C 

attached base packages: 
[1] parallel stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] doMC_1.3.2  iterators_1.0.6 foreach_1.4.1 

loaded via a namespace (and not attached): 
[1] codetools_0.2-8 compiler_3.0.1 tools_3.0.1 

Ho anche osservato lo stesso comportamento con altri backend paralleli. Entrambe le macchine hanno 20+ core. Qualche idea su cosa sta succedendo?

risposta

5

Il problema è stato causato da OpenBLAS. Passare a ATLAS ha risolto il problema. La ricetta per la commutazione tra le biblioteche Blas a Linux è in Nathan VanHoudnos's blog:

Passaggio da BLAS librerie

Ora possiamo passare tra le diverse opzioni BLAS installate:

sudo update-alternatives --config libblas.so.3gf

Ci sono 3 scelte per l'alternativa libblas.so.3gf (che fornisce /usr/lib/libblas.so.3gf).

Selection Path Priority Status 
------------------------------------------------------------ 
* 0 /usr/lib/openblas-base/libopenblas.so.0 40 auto mode 
1 /usr/lib/atlas-base/atlas/libblas.so.3gf 35 manual mode 
2 /usr/lib/libblas/libblas.so.3gf 10 manual mode 
3 /usr/lib/openblas-base/libopenblas.so.0 40 manual mode 
Press enter to keep the current choice[*], or type selection number: 

laterale nota: Se quanto sopra è tornato:

update-alternatives: error: no alternatives for libblas.so.3gf 

Prova

sudo update-alternatives --config libblas.so.3