2016-01-10 7 views
4

Я реализую систему параллельной обработки, которая в конечном итоге будет развернута на кластере, но у меня возникли проблемы с разработкой взаимодействия различных методов параллельной обработки.Параллельный r с foreach и mclapply в то же время

Мне нужно использовать цикл for для запуска большого блока кода, который содержит несколько больших операций с матрицами. Чтобы ускорить это, я хочу, чтобы параллельный цикл for с foreach() и параллелизировал операции списка с помощью mclapply.

пример псевдокода:

cl<-makeCluster(2) 
registerDoParallel(cl) 

outputs <- foreach(k = 1:2, .packages = "various packages") { 

    l_output1 <- mclapply(l_input1, function, mc.cores = 2) 
    l_output2 <- mclapply(l_input2, function, mc.cores = 2) 
    return = mapply(cbind, l_output1, l_output2, SIMPLIFY=FALSE) 
} 

Это похоже на работу. Мои вопросы:

1) разумный подход? Кажется, что они работают вместе над моими малогабаритными тестами, но это немного неприятно.

2) Сколько ядер/процессоров он будет использовать в любой момент времени? Когда я масштабирую его до кластера, мне нужно будет понять, как много я могу его подтолкнуть (foreach только петли 7 раз, но списки mclapply имеют до 70 или около того больших матриц). Кажется, что он создает 6 "ядер", как написано (предположительно 2 для foreach и 2 для каждого mclapply.

ответ

2

Я думаю, что это очень разумный подход к кластеру, поскольку он позволяет использовать несколько узлов, все еще используя более эффективный mclapply по всем ядрам отдельных узлов, а также позволяет выполнять некоторую пост-обработку рабочих (при этом в этом случае можно позвонить cbind), что может значительно повысить производительность.

На одной машине ваш пример будет создайте в общей сложности 10 дополнительных процессов: два на makeCluster, которые каждый раз звонят mclapply дважды (2 + 2 (2 + 2)). Однако только четыре из них должны использовать любое значительное процессорное время за раз. , реструктурируя функции, вызванные mclapply, так что вам нужно только позвонить mclapply один раз в цикле foreach, что может быть более эффективным.

На нескольких компьютерах вы создадите столько же процессов, но только два процесса на узел будут использовать много процессорного времени за раз. Поскольку они распределены по нескольким машинам, он должен хорошо масштабироваться.

Помните, что mclapply может не понравиться, если вы используете кластер MPI. MPI не любит вас для процессов вилки, как это делает mclapply. Он может просто выпустить некоторые строгие предупреждения, но я также видел other problems, поэтому я бы предложил использовать кластер PSOCK, который использует ssh для запуска рабочих на удаленных узлах, а не с использованием MPI.


Update

Похоже, есть проблема, вызывающая mclapply от кластера рабочих, созданных «параллельно» и «снег» пакеты. Для получения дополнительной информации см. Мой answer to a problem report.