블로그 보관함

2013년 6월 1일 토요일

R에서 parallel 패키지 이용하여 멀티코어 계산하기

R 3.0 기준으로 얘기하자면 parallel 패키지는 멀티코어 이용도 가능하게 해준다. multicore 패키지는 더이상 사용되지 않는다. 다음처럼 패키지를 로딩한다.
> require(parallel)

Linux, MacOSX에서 간단하게 mclappy와 같은 함수를 이용하는 예를 들면 다음과 같다. iMac 3.06GHz Intel Core 2 Duo에서 돌린 결과이다.
> system.time( out <- sapply(1:100000, function(.) mean(rnorm(100))))
   user  system elapsed
  2.916   0.039   2.959
> system.time( out <- mclapply(mc.cores=2, 1:100000, function(.) mean(rnorm(100))))
   user  system elapsed
  1.487   0.073   1.603
MS Windows에서는 mclapply가 제대로 작동하지 않는다. 대신 clusterApply를 쓸 수 있다. Intel Core i3 3.20GHz에 Windows 7이 설치된 PC에서 돌린 결과이다.
> system.time( out <- sapply(1:100000, function(.) mean(rnorm(100))) )
   user  system elapsed 
   2.66    0.00    2.67 
> cl <- makeCluster(4)
> system.time( out <- clusterApply(cl, 1:100000, function(.) mean(rnorm(100))) )
   user  system elapsed 
  12.85    8.23   21.94 
> stopCluster(cl)
이해가 가지 않는 결과이다. 코어 하나만 쓰는 것보다 코어 4개를 모두 쓰면 더 느려진다. 작업관리자에서 CPU 사용현황을 모니터링하면 멀티코어로 실행되는 것은 분명히 맞다. 이것은 core에 작업을 할당하는 문제 때문이다. 위 실험의 경우 100000개의 작업을 4개의 코어에 분배하여야한다. 그리고 하나의 작업은 매우 연산량이 매우 작다. 그 분배 처리 작업 때문에 하나의 코어에서 10만개 작업을 순차적으로 할당하는 것보다 느리게 되는 것이다. 코어가 4개이므로 10만번 시뮬레이션을 25000번의 시뮬레이션 4개로 나누어 할당하면 속도가 빨라진다.
> simul <- function(n) sapply(1:n, mean(rnorm(100)))
> system.time( out <- sapply(rep(25000, 4), simul) )
   user  system elapsed 
   2.60    0.01    2.68 
> cl <- makeCluster(4)
> system.time( out <-clusterApply(cl, rep(25000, 4), simul) )
   user  system elapsed 
   0.00    0.02    1.04 

댓글 없음:

댓글 쓰기