r - 为什么在 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。
解决方案
推荐阅读
- .net-core - 为 .NET Core Worker 服务设置环境名称(生产、开发等)
- javascript - 在 JavaScript 中解析嵌套的 Json 对象
- github - 用户分享主题的 Github URL
- reactjs - 我想使用我的表单输入来设置起点和终点
- c# - 将数据从 MySql 加载到数据网格表时,Visual Studio 中缺少 Cast 错误
- javascript - 如何在 Mysql 中将 Javascript 对象格式化为多边形
- azure-data-explorer - kusto 查询以在对其他两列使用 distinct 后显示第三列
- scala - Spark Scala SQL:取非空列的平均值
- multithreading - 使用 Threads.@threads 的意外行为?
- ansible - 我的 yaml 脚本在 raspberrypi 中不起作用