Почему время обработки ведет себя по-разному с этими двумя функциями, использующими параллель? - PullRequest
1 голос
/ 27 июня 2019

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

Чтобы использовать преимущества нескольких ядер (в Windows), я попробовал пакет parallel и получил очень разные результаты для двух функций, используя одну и ту же последовательность команд.

Что касается, по-видимому, более сложной функции (регрессии), представляется, что сокращение времени является значительным при использовании большего количества ядер (здесь я показываю результат с ПК с 3 ядрами и ПК с 12 ядрами, поведение аналогично с до 11 ядер, сокращение времени уменьшается с увеличением количества ядер). enter image description here enter image description here

Но для «простой» функции, то есть среднего значения квадратов, время выполнения очень изменчиво, почти неустойчиво (также тестируется с использованием до 11 ядер). enter image description here enter image description here

Во-первых, есть ли причина, по которой это происходит? Во-вторых, я думаю, что есть другие способы выполнить эту задачу, можете ли вы предложить какой-либо из них?

Вот код для генерации графиков:

library(parallel)
nc=detectCores()-1  #number of cores
myFun =function(z) coef(lm(rep(1,length(z))~z)) #regression
myFun2 =function(z) sum(z^2)/length(z) # mean  of squares
my.mat = matrix(rnorm(1000000,.01,0.4),ncol=100) #data
# using FUN = myFun 
# Replicate 10 times
for(j in 1:10){
ncor=2:nc
timed=c()
for (i in seq_along(ncor)){
cl <- makeCluster(mc <- getOption("cl.cores", ncor[i]))
stime <- Sys.time()
res=parApply(cl = cl, X = my.mat, MARGIN = 1, FUN = myFun)
tm=Sys.time()-stime
timed[i]=tm
stopCluster(cl)
}
# no cores
stime <- Sys.time()
res=apply(my.mat, MARGIN = 1, FUN = myFun)
tm=Sys.time()-stime
(dr=data.frame(nc=c(1,ncor),ts=as.numeric(c(tm,timed))))
plot(dr,type="l",col=3,main=j)
#stopCluster(cl)
if (j==1)fres1=dr else fres1=merge(fres1,dr,by="nc")
}
plot(fres1[,1:2],type="l",col=2,ylim=range(fres1[,-1]))
for(i in 3:11)lines(fres1[,i],col=i+1)

# For the second plot use the same code but change FUN = myFun2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...