Могу ли я вложить параллель ::: parLapply ()? - PullRequest
7 голосов
/ 07 декабря 2011

Предположим, что я хочу сделать что-то в R, которое обычно (в одном процессе / потоке) будет выглядеть следующим образом:

for(i in 1:2) {
    for(j in 1:2) {
        #Do some stuff here
    }
}

Используя новый пакет R параллельно, на четырехъядерной машине, могу ли я сделатьследующее?

cluster<-makeCluster(4)

innerLoop<-function() {
   #Do some stuff here
}

outerLoop<-function() { 
   result<-do.call(, parLapply(cluster, c(1:2), innerLoop))
}

final.result<-do.call(, parLapply(cluster, c(1:2), outerLoop))

Возможно ли это с параллельным пакетом, который поставляется с R-2.14.0?

1 Ответ

10 голосов
/ 07 декабря 2011

Да, вы можете сделать это. Для первого уровня распараллеливания вы должны использовать технологию распределенной памяти (как makeCluster () из пакета snow), а на втором уровне распараллеливания вы должны использовать технологию разделяемой памяти (многоядерный пакет, mclapply ()).

Вот простой пример кода:

library(parallel)

cl <- makeCluster(2)

inner <- function(x){
    pid <- Sys.getpid()
    name <- Sys.info()["nodename"]
    str <- paste("This is R running on", name, "with PID", pid, "!")
    return(str)
}

outer <- function(x, cores, funceval){
    require(parallel)
    mclapply(1:cores, funceval)
}

parLapply(cl, 1:length(cl), outer, 2, inner)

В выводе вы должны увидеть разные имена машин и разные PID!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...