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.603MS 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
댓글 없음:
댓글 쓰기