首页 > 解决方案 > 为什么在 for 循环中运行此函数平均比并行运行更快?

问题描述

具有 96 个 vCPU 和 768 GB RAM 的 Amazon EC2。与 parSapply 相比,for 循环每次迭代只需要大约一半的时间。

library(parallel)

mat <- matrix(rnorm(100*100), nrow = 100, ncol = 100)

theFunction <- function (x) {
  startTime <- proc.time()[3]
  for (i in 1:500){
    mat <- crossprod(mat,mat)
  }
  elapsedTime <- proc.time()[3] - startTime
  
  return(elapsedTime)
}

nTrials <- detectCores()
print(nTrials)
[1] 96

# 96 trials using for loop
elapsedTimeTotal <- 0
for (i in 1:nTrials){
  elapsedTimeTotal <- elapsedTimeTotal + theFunction(0)
}
elapsedTimeAverage <- elapsedTimeTotal / nTrials
print(elapsedTimeAverage)
[1] 0.4333125 

# 96 trials using parSapply
cl <- makeCluster(nTrials)
clusterExport(cl,"mat")
elapsedTimeAverage <- mean(parSapply(cl,1:nTrials,theFunction))
print(elapsedTimeAverage)
[1] 0.7999688

所以 0.4333125 与 0.7999688 相比。为什么?我的假设是,除非存在内存问题,否则这些数字将相等。我尝试过使用更少的内核,它使差异更小,但绝不为 0。

标签: rperformancematrix-multiplication

解决方案


推荐阅读