2014-06-10 2 views
5

foreach을 사용하는 경우 doMC을 백엔드로 사용하면 다른 시스템에서 다른 동작을 생성합니다.멀티 코어를 사용하지 않는 foreach

우분투 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 

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 

나는 다른 병렬 백엔드를 사용하여 동일한 동작을 관찰했다. 두 기계 모두 20 개 이상의 코어를 가지고 있습니다. 무슨 일이 일어나고 있는지에 대한 아이디어가 있습니까?

답변

5

문제는 OpenBLAS에서 발생했습니다. ATLAS로 전환하면 문제가 해결되었습니다. 리눅스에서 BLAS 라이브러리 사이의 전환에 대한 조리법 Nathan VanHoudnos's blog에 :이

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

: BLAS 사이

전환은

지금 우리가 설치되어있는 다른 BLAS 옵션 사이를 전환 할 수 있습니다 도서관 대체 libblas.so.3gf (/usr/lib/libblas.so.3gf 제공)에 대한 3 가지 선택 사항입니다.

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 
관련 문제