2014-06-10 51 views
5

我有一個案例,foreach使用doMC作爲後端在不同的機器上產生不同的行爲。R foreach不使用多個核心

在運行Ubuntu 12.04.4 LTS的Linux服務器上,以下代碼(改編自foreach vingette)在單個內核上同時運行5個作業,這不是所需的行爲。

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

會議信息:

> 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 

在Mac上相同的代碼運行OSX運行產生10.7.5上運行5個不同的內核晚五組的工作的期望和預期的行爲。

會議信息:

> 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 

我一直在使用其他並行後端也觀察到相同的行爲。這兩款機器都有20+個內核。關於發生什麼事的任何想法?

回答

5

該問題是由OpenBLAS引起的。切換到ATLAS解決了這個問題。在Linux中BLAS庫之間切換的配方是Nathan VanHoudnos's blog:BLAS之間

交換庫

現在我們可以安裝的不同BLAS選項之間進行切換:

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

有是替代libblas.so.3gf的3種選擇(提供/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: 

附註:如果上面的返回:

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

嘗試

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