R foreach 并不能提高速度

问题描述 投票:0回答:1

我正在尝试使用

foreach
来并行化一些矩阵计算。然而,我发现它提供了与
apply
for
循环相似的性能,尽管我使用了 10 个核心。

library(microbenchmark)
library(foreach)
library(doParallel)


mat = matrix(rnorm(3000 * 3000), 3000) # 3000 X 3000
g = rnorm(3000) # 3000 

# use 10 cores
cl <- makeCluster(10)
registerDoParallel(cl)
microbenchmark(
  # multi-core with foreach 
  foreach(i = 1:100, .combine = c) %dopar% {t(g) %*% mat %*% g},
  
  # sapply 
  sapply(1:100, function(i){t(g) %*% mat %*% g}), 
  
  # for loop 
  for(i in 1:100){t(g) %*% mat %*% g},
  
  times = 20)
stopCluster(cl)

enter image description here

另一方面,如果我使用不同的函数 (

Sys.sleep()
),
foreach
确实可以比
apply
for
循环快约 10 倍。

cl <- makeCluster(10)
registerDoParallel(cl)
microbenchmark(
  # multi-core with foreach 
  foreach(i = 1:100, .combine = c) %dopar% {Sys.sleep(0.01) },
  
  # sapply 
  sapply(1:100, function(i){Sys.sleep(0.01)}), 
  
  # for loop 
  for(i in 1:100){Sys.sleep(0.01)},
  
  times = 20)
stopCluster(cl)

enter image description here

原因是什么?如何提高矩阵计算的性能?

r optimization parallel-processing parallel-foreach
1个回答
0
投票

@Dave2e 建议我应该增加迭代次数。确实,如果我有

cl <- makeCluster(10)
registerDoParallel(cl)
microbenchmark(
  # multi-core with foreach 
  foreach(i = 1:3000, .combine = c) %dopar% {t(g) %*% mat %*% g},
  
  # sapply 
  sapply(1:3000, function(i){t(g) %*% mat %*% g}), 
  
  # for loop 
  for(i in 1:3000){t(g) %*% mat %*% g},
  
  times = 5)
stopCluster(cl)

然后

foreach
使用 5 秒,相比之下
apply
loop

需要 32 秒
© www.soinside.com 2019 - 2024. All rights reserved.