2014-10-27 1 views
0

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

Я попытался простой пример:

время
library(foreach) 
library(doParallel) 

stime<-system.time(for (i in 1:10000) rnorm(10000))[3] 
print(stime) 
10.823 

cl<-makeCluster(2) 
registerDoParallel(cores=2) 
stime<-system.time(ls<-foreach(s = 1:10000) %dopar% rnorm(10000))[3] 
stopCluster(cl) 
print(stime) 
29.526 

Система является более вдвое больше, чем это было в первоначальном случае без параллельных вычислений.

Очевидно, что я делаю что-то неправильно, но я не могу понять, что это такое.

+0

Накладные расходы связаны с параллельными вычислениями. Этот результат можно ожидать. – Frank

+0

Вы имеете в виду, что для запуска кластеров требуется время? или что вы имеете в виду? – ghb

+0

Да, но я измеряю только задачу, а не время, затрачиваемое на инициализацию кластеров. когда я должен ожидать получить большую выгоду? – ghb

ответ

2

Выполнение множества крошечных задач параллельно может быть очень неэффективным. Стандартное решение заключается в использовании отрывов:

ls <- foreach(s=1:2) %dopar% { 
    for (i in 1:5000) rnorm(10000) 
} 

Вместо выполнения 10000 крошечных задач параллельно, этот цикл выполняет две большие задачи, и работает почти в два раза быстрее, чем в последовательной версии на моей машине Linux.

Также обратите внимание, что ваш пример «foreach» фактически отправляет большое количество данных от рабочих хозяину. Мой пример «foreach» выбрасывает эти данные так же, как ваш последовательный пример, поэтому я думаю, что это лучшее сравнение.

Если вам необходимо вернуть большое количество данных, то справедливое сравнение будет:

ls <- lapply(rep(10000, 10000), rnorm) 

против:

ls <- foreach(s=1:2, .combine='c') %dopar% { 
    lapply(rep(10000, 5000), rnorm) 
} 

На моей машине Linux времена являются 8,6 секунды против 7,0 секунды. Это не впечатляет из-за большого отношения к вычислению, но было бы намного хуже, если бы я не использовал chunking.

+0

Не уверен, что lapply делает то, что вы думаете? –

+0

@MartinMorgan К сожалению. Спасибо, что указали это, Мартин. Надеюсь, теперь это правильно. –

Смежные вопросы