我正在尝试使用
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)
另一方面,如果我使用不同的函数 (
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)
原因是什么?如何提高矩阵计算的性能?
@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 秒