Я запускаю следующий код (извлеченный из виньетки doParallel а>) на ПК (ОС Linux) с 4 и 8 физическими и логическими ядрами соответственно.
Запустив код с iter=1e+6
или меньше, все в порядке, и я вижу по загрузке ЦП, что все ядра используются для этого вычисления. Однако при большем количестве итераций (например, iter=4e+6
) кажется, что в этом случае параллельные вычисления не работают. Когда я также отслеживаю использование ЦП, в вычислениях участвует только одно ядро (100% загрузка).
Пример 1
require("doParallel")
require("foreach")
registerDoParallel(cores=8)
x <- iris[which(iris[,5] != "setosa"), c(1,5)]
iter=4e+6
ptime <- system.time({
r <- foreach(i=1:iter, .combine=rbind) %dopar% {
ind <- sample(100, 100, replace=TRUE)
result1 <- glm(x[ind,2]~x[ind,1], family=binomial(logit))
coefficients(result1)
}
})[3]
Вы хоть представляете, в чем может быть причина? Может быть причина в памяти?
Я погуглил и нашел ЭТО имеет отношение к моему вопросу, но дело в том, что мне не сообщают о какой-либо ошибке, и ОП, похоже, нашел решение, предоставив необходимые пакеты внутри цикла foreach
. Но, как видно, внутри моего цикла не используется никакой пакет.
ОБНОВЛЕНИЕ1
Моя проблема до сих пор не решена. Согласно моим экспериментам, я не думаю, что память может быть причиной. У меня есть 8 ГБ памяти в системе, в которой я запускаю следующую простую параллельную (по всем 8 логическим ядрам) итерацию:
Пример 2
require("doParallel")
require("foreach")
registerDoParallel(cores=8)
iter=4e+6
ptime <- system.time({
r <- foreach(i=1:iter, .combine=rbind) %dopar% {
i
}
})[3]
У меня нет проблем с запуском этого кода, но когда я отслеживаю использование ЦП, только одно ядро (из 8) составляет 100%.
ОБНОВЛЕНИЕ 2
Что касается Example2, @SteveWeston (спасибо за указание на это) заявил, что (в комментариях): «Пример в вашем обновлении страдает от крошечных задач. Только у мастера есть реальная работа, который состоит из отправки задач и обработки результатов. Это принципиально отличается от проблемы с исходным примером, который использовал несколько ядер при меньшем количестве итераций».
Однако Пример 1 по-прежнему остается нерешенным. Когда я его запускаю и слежу за процессами с htop
, вот что происходит подробнее:
Назовем все 8 созданных процессов от p1
до p8
. Статус (столбец S
в htop
) для p1
равен R
, что означает, что он работает и остается неизменным. Однако для p2
до p8
через несколько минут статус меняется на D
(т.е. непрерывный сон) и через несколько минут снова меняется на Z
(т.е. завершен, но не получен его родителем). У вас есть идеи, почему это происходит?
cl <- makePSOCKcluster(8); registerDoParallel(cl)
? - person Hack-R   schedule 10.06.2016iter=15e+6
? Не могли бы вы прокомментировать характеристики вашего оборудования (процессор и память) и тип ОС, на которой вы запускаете код? - person 989   schedule 10.06.2016Rscript.exe
в своем мониторе ресурсов, хотя они использовали лишь небольшую часть ядра ЦП, на котором работали (но это не обязательно проблема — он может колебаться из-за неэффективного разделения). Я запускал его на Windows Server 2008 с 24 физическими процессорами. - person Hack-R   schedule 10.06.2016registerDoParallel()
также подходит, как написано в виньетке, предоставленной авторами пакета. У меня такое ощущение, что это как-то связано с памятью. - person 989   schedule 10.06.201615e+6
, но около3.8e+6
. На самом деле я пытался проверить на игрушечном примере (как показано выше), все ли идет хорошо, а затем провел свои эксперименты. В моих экспериментах мне нужно повторитьforeach
примерно100
раз. Поэтому я думаю, что мне нужно разбить100
повторений, а неforeach
раз. - person 989   schedule 10.06.2016getDoParRegistered()
иgetDoParWorkers()
? - person Bryan Goggin   schedule 10.06.2016getDoParRegistered()
я получаюTRUE
и8
заgetDoParWorkers()
. - person 989   schedule 10.06.2016iter=3e+6
? - person 989   schedule 14.06.2016