Я новичок в параллельном программировании и почерпнул информацию о R из различных (иногда противоречивых) источников. Я унаследовал некоторый код и попытался распараллелить его, я думаю, что распараллеливание данных уместно.
Задача требует некоторых вычислений для ряда особей (этап 1), затем вычисленные величины используются для расчета некоторых характеристик совокупности (этап 2). Мы делаем это для цикла с заданным числом итераций. У меня есть подозрение (собирая воедино биты, которые я прочитал), что вычисления из фазы 1 вызывают изменение объекта, хранящего результаты, из-за чего вычисления страдают от некоторого времени ожидания, вызванного (нежелательным) копированием объектов. В результате выполнение программы с использованием clusterMap занимает гораздо больше системного времени, чем непараллельная версия кода с использованием mapply.
Вычисления требуют многих уровней вызовов функций. Я попытался дать представление о структуре кода на небольшом рабочем примере ниже.
require(parallel)
## define the two phases of the computation
phase1.top.level<- function(x,y){second.level(x,y)}
## Functions call other functions.
phase1.second.level<- function(x,y){ third.level(x,y) }
phase1.third.level<- function(x,y){ result<- x^2-2*y*x; result }
## define the function that performs the second phase of the computation
second.phase<-function(input,x,y) {input+x+y}
## Assemble these functions into an algorithm
multi.phase.comp<- function(input,x,y){
input<-phase1.top.level(x,y)
output<-second.phase(input,x,y)
}
### Call the function with inputs
x<-seq(1:100)
y<-seq(1:100)
input<-rep(1,100)
## Time the function executed for the vector inputs using clusterMap from the parallel package
system.time({
no_cores<-5
c1<- makeCluster(no_cores,type="FORK")
out<- clusterMap(cl=c1, multi.phase.comp, input, x, y)
stopCluster(c1)
})
### One execution of this (on an old laptop) gave
### user system elapsed
### 0.055 0.163 0.973
## Regrettably, the effort to parallelise wasn't justified as mapply is faster:
system.time({
out2<- mapply( multi.phase.comp, input, x, y)
})
#### This shows much less system and elapsed time
#### user system elapsed
#### 0.009 0.002 0.030
Любые предложения о том, как я могу ускорить свой код? Будет ли мне лучше использовать кластеры сокетов для этого типа приложений?
mcmapply(multi.phase.comp, input, x, y, mc.cores=no_cores)
(без всяких makeCluster, stopCluster)? - person Steve Weston   schedule 05.12.2016