Распараллеливание MPI с использованием SNOW происходит медленно - PullRequest
4 голосов
/ 16 февраля 2011

Мой набег на распараллеливание продолжается. Изначально у меня были трудности с установкой Rmpi, но у меня все получилось (мне нужно было sudo apt-get). Я должен сказать, что я работаю на машине с Ubuntu 10.10.

Я запустил ту же симуляцию, что и мой предыдущий вопрос . Напомним системное время для кластеризованного кластера и кластера SNOW SOCK соответственно:

> system.time(CltSim(nSims=10000, size=100))
   user  system elapsed 
  0.476   0.008   0.484 
> system.time(ParCltSim(cluster=cl, nSims=10000, size=100))
   user  system elapsed 
  0.028   0.004   0.375 

Теперь, используя кластер MPI, я получаю скорость замедление относительно отсутствия кластеризации:

> stopCluster(cl)
> cl <- getMPIcluster()
> system.time(ParCltSim(cluster=cl, nSims=10000, size=100))
   user  system elapsed 
  0.088   0.196   0.604 

Не уверен, полезно ли это, но вот информация о созданном кластере:

> cl
[[1]]
$rank
[1] 1

$RECVTAG
[1] 33

$SENDTAG
[1] 22

$comm
[1] 1

attr(,"class")
[1] "MPInode"

[[2]]
$rank
[1] 2

$RECVTAG
[1] 33

$SENDTAG
[1] 22

$comm
[1] 1

attr(,"class")
[1] "MPInode"

attr(,"class")
[1] "spawnedMPIcluster" "MPIcluster"        "cluster"          

Есть идеи о том, что здесь может происходить? Спасибо за вашу помощь, когда я опробую эти варианты распараллеливания.

Сердечно, Charlie

1 Ответ

3 голосов
/ 16 февраля 2011

Это немного похоже на ваш другой вопрос: связь между узлами в кластере занимает больше времени, чем фактическая функция.

Это можно проиллюстрировать, изменив свои функции:

library(snow)
cl <- makeCluster(2)

SnowSim <- function(cluster, nSims=10,n){
  parSapply(cluster, 1:nSims, function(x){
    Sys.sleep(n)
    x
  })
}



library(foreach)
library(doSNOW)
registerDoSNOW(cl)

ForSim <- function(nSims=10,n) {
  foreach(i=1:nSims, .combine=c) %dopar% {
      Sys.sleep(n)
      i
  }
}

Таким образом, мы можем моделировать функцию длинного расчета и короткого вычисления в различном количестве симуляций. Давайте возьмем два случая, один из которых рассчитан на 1 секунду и 10 циклов, а другой - на 1 мс и 10000 циклов. Оба должны длиться 10 секунд:

> system.time(SnowSim(cl,10,1))
   user  system elapsed 
      0       0       5 

> system.time(ForSim(10,1))
   user  system elapsed 
   0.03    0.00    5.03 

> system.time(SnowSim(cl,10000,0.001))
   user  system elapsed 
   0.02    0.00    9.78 

> system.time(ForSim(10000,0.001))
   user  system elapsed 
  10.04    0.00   19.81 

По сути, вы видите, что для длинных вычисляющих функций и низких симуляций распараллеленные версии аккуратно сокращают время вычисления вдвое, как и ожидалось.

Теперь симуляции, которые вы делаете, относятся ко второму случаю. Там вы видите, что решение snow на самом деле больше ничего не меняет, а решение foreach даже требует вдвое больше. Это просто из-за накладных расходов на связь между узлами и между ними, а также на обработку возвращаемых данных. Издержки foreach намного больше, чем с snow, как показано в моем ответе на ваш предыдущий вопрос.

Я не запустил Ubuntu, чтобы попробовать кластер MPI, но это в основном та же история. Между различными типами кластеров существуют тонкие различия в зависимости от времени, необходимого для связи, отчасти из-за различий между базовыми пакетами.

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