Системное время для параллельной и последовательной обработки

я запускаю байесовскую пробит-модель MCMC, и я пытаюсь реализовать ее параллельно. Я получаю запутанные результаты о производительности моей машины при сравнении параллельно с последовательным. У меня нет большого опыта параллельной обработки, поэтому возможно, я делаю это неправильно.

Я использую MCMCprobit на MCMCpack пакет для модели probit и для параллельной обработки я использую parLapply на parallel пакета.

вот мой код последовательный запуск и результаты из system.time:

system.time(serial<-MCMCprobit(formula=econ_model,data=mydata,mcmc=10000,burnin=100))

   user  system elapsed 
 657.36   73.69  737.82

вот мой код для параллельного запуска:

#Setting up the functions for parLapply:
probit_modeling <- function(...) {
  args <- list(...)
  library(MCMCpack)
  MCMCprobit(formula=args$model, data=args$data, burnin=args$burnin, mcmc=args$mcmc, thin=1)
}

probit_Parallel <- function(mc, model, data,burnin,mcmc) {
  cl <- makeCluster(mc)
  ## To make this reproducible:
  clusterSetRNGStream(cl, 123)
  library(MCMCpack) # needed for c() method on master
  probit.res <- do.call(c, parLapply(cl, seq_len(mc), probit_modeling, model=model, data=data, 
                                        mcmc=mcmc,burnin=burnin))
  stopCluster(cl)
  return(probit.res)
}


system.time(test<-probit_Parallel(model=econ_model,data=mydata,mcmc=10000,burnin=100,mc=2))

и результаты system.time:

   user  system elapsed 
   0.26    0.53 1097.25 

любые идеи, почему время пользователя и системы будет намного короче для параллельного процесса, но прошедшее время намного дольше? Я попробовал его на более коротких пробегах MCMC (100 и 1000), и история та же. Полагаю, я где-то ошибаюсь.

вот мой компьютер технические характеристики:

  • R 3.1.3
  • 8 ГБ
  • Windows 7 64 бит
  • процессор Intel Core i5 2520M, двухъядерный

1 ответов


мне кажется, что оба работника выполняют столько же работы, сколько выполняется в последовательной версии. Рабочие должны выполнять только часть общей работы, чтобы выполнить быстрее последовательной версии кода. Это может быть достигнуто путем деления mcmc по количеству работников в этом примере, хотя это может быть не то, что вы действительно хотите сделать.

Я думаю, что это объясняет долгое прошедшее время, сообщенное system.time. "Пользователь" и " система" время короткое, потому что это время для основного процесса, который использует очень мало времени процессора при выполнении parLapply: Реальное время процессора используется работниками, о котором не сообщается system.time.