2012-02-29 2 views
3

멀티 코어 R 패키지에서 병렬 및 수집 기능을 사용하여 간단한 매트릭스 곱셈 코드를 병렬 처리합니다. 대답은 정확하지만 병렬화 된 버전은 직렬 버전과 같은 시간이 걸리는 것으로 보입니다.멀티 코어에서 멀티 코어 사용 탐지/보장

내 컴퓨터에서 8 개가 아닌 하나의 코어에서만 작동하는 것으로 의심됩니다. 이를 감지하고 1 개 이상의 코어 사용을 보장 할 수있는 방법이 있습니까?

library("multicore") 

A = read.table("matrixA.txt") 
B = read.table("matrixB.txt") 
A = as.matrix(A) 
B = as.matrix(B) 
rows = dim(A)[1] 
columns = dim(B)[2] 

C <- mcparallel(A%*%B) 
C <- collect(list(C)) 
C <- as.matrix(C[[1]]) 

write.table(C,"matrixC_mc.txt",row.names=FALSE, col.names=FALSE) 

답변

4

하는 당신이 사용하는 OS에, 당신에게 프로세서 사용량을 확인 따라 :

여기 내 코드입니다. 병렬 처리를 사용하면 top에서 6 개의 프로세서가 모두 사용된다는 것을 분명히 알 수 있습니다.

코드 예제와 관련하여 mcparallel (사용하지 말고 parallel을 설명서에 따라 사용)은 해당 표현식으로 새 프로세스를 생성하기 만하면됩니다. 따라서 행렬 곱셈을 사용하여 하나의 새로운 프로세스를 생성하면 단 하나의 코어 만 사용됩니다. parallel을 여러 번 호출 할 때만 여러 프로세스가 시작되고 여러 코어가 사용됩니다. 어쩌면 매트릭스를 자르고 여러 프로세스에서 실행하고 나중에 결합하면 몇 가지 이점을 얻을 수 있습니다. 당신은 이것을 위해 mclapply를 볼 수 있습니다. 그러나 병렬 선형 대수학은 multicore 패키지가 아닌 병렬 처리를 지원하는 blas (선형 대수 라이브러리) 버전을 사용하는 것이 더 쉽습니다. , 그 자체로 mcparallel가로 행렬 곱셈을 설정하지 않습니다 또한

R> parallel::detectCores() 
[1] 8 
R> 

:

+0

작업에서 사용중인 코어 수를 확인할 수있는 사용자 눈동작 상단이 아닌 R이 필요합니다. – tim

+0

새로운 질문이있는 경우 새로 질문 할 것을 권장합니다. 댓글로 게시하지 마세요. 코멘트로서 많은 주목을받지 못할 것입니다. 리눅스에서는이 줄이 유용 할 수 있습니다 : http://stackoverflow.com/questions/6481005/obtain-the-number-of-cpus-cores-in-linux. –

5

parallel 패키지의 detectCores() 기능은 R 2.14.0 당신이 실제로 여러 개의 코어를 가지고 있는지 확인하기 위해 필요한 않기 때문에 포함 병렬 작업 ("어려운"문제이므로 ScaLAPACK 라이브러리 참조). 하지만 이와 같은 간단한 무언가를 시도 할 수 있습니다 :

R> X <- 1:1e3 
R> rbenchmark::benchmark(serial=sapply(X, function(x) log(sqrt(x))), 
+>      parallel=mclapply(X, function(x) log(sqrt(x))), 
+>      replications=500) 
     test replications elapsed relative user.self sys.self user.child sys.child 
2 parallel   500 12.018 10.96  0.000 10.59  0.952  15.07 
1 serial   500 1.097  1.00  1.208  0.00  0.000  0.00 
R> 

그래서 짧은 벡터, 병렬 이득에 대한 간단한 작업 (sqrt(log(x)))의 500 개 복제를 위해. 그러나 생활은 결코 쉬운 : 큰 벡터에 차이가 사라 :

R> X <- 1:1e5 
R> rbenchmark::benchmark(serial=sapply(X, function(x) log(sqrt(x))), 
+>      parallel=mclapply(X, function(x) log(sqrt(x))), 
+>      replications=10) 
     test replications elapsed relative user.self sys.self user.child sys.child 
2 parallel   10 2.030  1.00  0.476 0.272  1.952  1.112 
1 serial   10 2.821  1.39  2.228 0.592  0.000  0.000 
R> 

슬픈 소식은 병렬 컴퓨팅 까다로운, 그냥 mcparallel 또는 parallel에 식을 고집하는 것보다 훨씬 더 열심히 것입니다.

관련 문제