为什么顺序代码优于R中的并行代码

时间:2017-08-14 15:04:26

标签: r parallel-processing

我将串行代码转换为并行,但我不知道为什么并行代码比顺序代码需要更长的时间。顺序只需几秒钟,而并行需要大约8到9分钟。如何改进我的代码?

我能够创建一个与原始问题类似的问题。这是代码。数据结构与我原来的问题相同,无法改变(我相信)。

并行代码:

rm(list=ls())
library(foreach); library(doParallel)

CORES<-16
c1<-makeCluster(CORES)
registerDoParallel(c1)

CASES<-64
preV<-list()
for (i in 1:CASES) preV[[i]]<-c(110, 1340, 4560, 230, 10)

#mimicking original problem
#===========================================
out<-list()
for (i in 1:CASES) out[[i]]<-list()
out1<-matrix(0,nrow=131041,ncol=6)
for (i in 1:CASES){ 
  out1[,]<-runif(6*131041,1,100)
  out[[i]]<-rbind(out[[i]],out1)
}
#===========================================

Y1<-Y2<-Y3<-Y4<-Y5<-c(0)
TOL <- 1E-3

time1<-Sys.time()
status<-foreach (j = 1:CASES, .combine='rbind', .inorder=FALSE) %dopar% {
#status<-list(); for (i in 1:CASES) status[[i]]<-list()
#for (j in 1:CASES)  {
  Y1[j] <- as.numeric(out[[j]][length(out[[j]][,1]),2])
  Y2[j] <- as.numeric(out[[j]][length(out[[j]][,1]),3])
  Y3[j] <- as.numeric(out[[j]][length(out[[j]][,1]),4])
  Y4[j] <- as.numeric(out[[j]][length(out[[j]][,1]),5])
  Y5[j] <- as.numeric(out[[j]][length(out[[j]][,1]),6])

  v1<-abs(Y1[j]-preV[[j]][1])
  v2<-abs(Y2[j]-preV[[j]][2])
  v3<-abs(Y3[j]-preV[[j]][3])
  v4<-abs(Y4[j]-preV[[j]][4])
  v5<-abs(Y5[j]-preV[[j]][5])


  if (v1<TOL & v2<TOL & v3<TOL & v4<TOL & v5<TOL)
    st<-1
  else
    st<-0

  #status[[j]]<-c(Y1[j],Y2[j],Y3[j],Y4[j],Y5[j],st)
  return (c(j,Sys.getpid(),Y1[j],Y2[j],Y3[j],Y4[j],Y5[j],st))
}# End of j-Loop

time2<-Sys.time()

stopCluster(c1)
print(difftime(time2,time1))

要将并行代码转换为序列号:

取消注释三个3行

#status<-list(); for (i in 1:CASES) status[[i]]<-list()
#for (j in 1:CASES)  {
..............
..............
#status[[j]]<-c(Y1[j],Y2[j],Y3[j],Y4[j],Y5[j],st)

并注释掉以下两行:

status<-foreach (j = 1:CASES, .combine='rbind', .inorder=FALSE) %dopar% {
..................
..................
return (c(j,Sys.getpid(),Y1[j],Y2[j],Y3[j],Y4[j],Y5[j],st))

0 个答案:

没有答案