Поэкспериментировав с функцией R parallel::mclapply
, я обнаружил, что аргумент mc.cores
можно выбрать больше, чем количество логических ядер (на что указывает parallel::detectCores
), в результате чего ускорение превысит количество логических ядер. Вот минимальный пример (для меня это работало на MacOS и Linux):
sleepy <- function(i) {
start <- Sys.time()
Sys.sleep(i)
as.numeric(Sys.time() - start)
}
mc.cores <- 100L
ntasks <- 10000L
start <- Sys.time()
out <- parallel::mclapply(2/ntasks*runif(ntasks), sleepy, mc.cores = mc.cores)
real_duration <- as.numeric(Sys.time() - start)
cpu_duration <- sum(unlist(out))
data.frame(logical.cores = parallel::detectCores(),
mc.cores = mc.cores,
speedup = cpu_duration/real_duration)
## logical.cores mc.cores speedup
## 1 8 100 30.49574
Я также попробовал это на более реалистичном примере, то есть близком к реальному сценарию, который я хочу распараллелить: это также не привело к каким-либо проблемам.
В документации /tutorials по parallel::mclapply
я не смог найти ни одного примера, где был бы выбран mc.cores > detectCores()
, и, скорее всего, для этого есть очень веская причина.
Может ли кто-нибудь объяснить, в чем заключаются проблемы с этой практикой? Может ли это быть разумным в определенных обстоятельствах, например. когда требования к памяти не являются проблемой?
parallel::detectCores(logical = FALSE)
? - person F. Privé   schedule 09.04.2020