r双并行qbeta与RcppParallel-如何在满容量下使用内核
我运行下面的示例代码来模拟这些值,下面是4个内核使用情况的快照。在满容量下使用所有内核需要一段时间,我想了解发生了什么,以及最终如何使其更快r双并行qbeta与RcppParallel-如何在满容量下使用内核,r,rcpp,doparallel,R,Rcpp,Doparallel,我运行下面的示例代码来模拟这些值,下面是4个内核使用情况的快照。在满容量下使用所有内核需要一段时间,我想了解发生了什么,以及最终如何使其更快 library(doParallel) library(data.table) data<-data.table(a=runif(10000000),b=runif(10000000),quantile=runif(10000000)) e <- nrow(data)%/%1000000+1 dataSplit<-split(dat
library(doParallel)
library(data.table)
data<-data.table(a=runif(10000000),b=runif(10000000),quantile=runif(10000000))
e <- nrow(data)%/%1000000+1
dataSplit<-split(data[],seq_len(nrow(data))%/%1000000)
qbetaVec<-function(lossvalues) qbeta(lossvalues$quantile,lossvalues$a,lossvalues$b)
cl <- makeCluster(4)
registerDoParallel(cl)
res2<-foreach(i=1:e) %dopar% qbetaVec(dataSplit[[i]])
res3<-unlist(res2)
库(双并行)
库(数据表)
数据并行化涉及开销,尤其是与工人之间的数据传输。此外,如果您只使用四个工人,并且每个任务所需的时间大致相同,那么将其拆分为四个以上的任务是没有意义的
library(microbenchmark)
microbenchmark(
OP = {
e <- nrow(data)%/%1000000+1
dataSplit<-split(data[],seq_len(nrow(data))%/%1000000)
qbetaVec<-function(lossvalues) qbeta(lossvalues$quantile,lossvalues$a,lossvalues$b)
cl <- makeCluster(4)
registerDoParallel(cl)
res2<-foreach(i=1:e) %dopar% qbetaVec(dataSplit[[i]])
res3<-unlist(res2)
stopCluster(cl)
},
OP_4split = {
e <- 4
dataSplit<-split(data[],seq_len(nrow(data)) %% e) #note this change
qbetaVec<-function(lossvalues) qbeta(lossvalues$quantile,lossvalues$a,lossvalues$b)
cl <- makeCluster(e)
registerDoParallel(cl)
res2<-foreach(i=1:e) %dopar% qbetaVec(dataSplit[[i]])
res3<-unlist(res2)
stopCluster(cl)
},
serial = {
res3 <- data[, qbeta(quantile, a, b)]
},
times = 3
)
#Unit: seconds
# expr min lq mean median uq max neval
# OP 17.31950 17.35962 17.37491 17.39975 17.40262 17.40549 3
# OP_4split 15.98415 16.03414 16.10776 16.08413 16.16957 16.25500 3
# serial 22.62642 22.64165 22.66247 22.65689 22.68050 22.70411 3
库(微基准)
微基准(
OP={
这是一个玩具的例子吗?因为你不需要并行化就可以使它更快。@Roland我自己使用qbeta,因为它是矢量化的,速度更快(大约2倍)。我想看看并行化是否可以进一步改进。谢谢你的投入。我可以问一下你使用什么处理器吗?它比时间快4倍。我也应该研究改进硬件。关于数据拆分,我尝试了这个方法,它节省了时间,但不确定:e@charliealphan i7-4790K@4.00GHz