我将串行代码转换为并行,但我不知道为什么并行代码比顺序代码需要更长的时间。顺序只需几秒钟,而并行需要大约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))