我有一个案例,foreach使用doMC后端在不同的机器上产生不同的行为.
在运行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)
}
Run Code Online (Sandbox Code Playgroud)
会话信息:
> 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
Run Code Online (Sandbox Code Playgroud)
运行OSX 10.7.5的Mac上运行的相同代码会产生在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
Run Code Online (Sandbox Code Playgroud)
我也观察到使用其他并行后端的相同行为.两台机器都有20多个核心.关于发生了什么的任何想法?
这个问题是由OpenBLAS引起的.切换到ATLAS解决了这个问题.在Linux中切换BLAS库的方法是在Nathan VanHoudnos的博客上:
在BLAS库之间切换
现在我们可以在安装的不同BLAS选项之间切换:
sudo update-alternatives --config libblas.so.3gf
替代libblas.so.3gf有三种选择(提供/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:
Run Code Online (Sandbox Code Playgroud)
附注:如果以上返回:
update-alternatives: error: no alternatives for libblas.so.3gf
Run Code Online (Sandbox Code Playgroud)
尝试
sudo update-alternatives --config libblas.so.3
Run Code Online (Sandbox Code Playgroud)