微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 `future` 进行并行化时速度增益不佳

如何解决使用 `future` 进行并行化时速度增益不佳

我发现在 future 中使用 furrr(和 R)包进行并行化的速度增益并不令人满意。尤其是速度提升并不接近线性。我的机器有 4 个工人,所以我认为当我指定的工人数量不大于我机器中可用的内核数量时,速度增益应该是线性的。然而,事实并非如此。

以下是说明问题的示例,其中我绘制了 10^7 个随机数 500 次。

library(future)
library(furrr)

# Parameters
n <- 1e7
m <- 500

# Compute the mean
rmean <- function(x,n) {
  rand.vec <- runif(n)
  rand.mean <- mean(rand.vec)
  return(rand.mean)
}

# Record the time used to compute the mean of n numbers for m times
rtime <- function(m,n) {
  t1 <- Sys.time()
  temp <- future_map(.x = 1:m,.f = rmean,n = n,.options = furrr::furrr_options(seed = TRUE))
  t2 <- Sys.time()
  # Print the time used
  print(t2 - t1)
  return(temp)
}

# Print the time used for different number of workers 
plan(multisession,workers = 1)
set.seed(1)
x <- rtime(m,n)
# Time difference of 2.503885 mins

plan(multisession,workers = 2)
set.seed(1)
x <- rtime(m,n)
# Time difference of 1.341357 mins

plan(multisession,workers = 3)
set.seed(1)
x <- rtime(m,n)
# Time difference of 57.25641 secs

plan(multisession,workers = 4)
set.seed(1)
x <- rtime(m,n)
# Time difference of 47.31929 secs

在上面的例子中,我得到的速度增益是:

  • 2 个工人 1.87 倍
  • 3 名工人为 2.62 倍
  • 4 名工人 3.17 倍

上面例子中的速度增益不是接近线性的,尤其是当我使用 4 个工人时。我认为这可能是因为 plan 函数的开销时间。但是,如果我在设置工人数量后多次运行该程序,速度增益是相似的。如下图所示:

plan(multisession,n)
# Time difference of 58.07243 secs
set.seed(1)
x <- rtime(m,n)
# Time difference of 1.012799 mins
set.seed(1)
x <- rtime(m,n)
# Time difference of 57.96777 secs

我还尝试使用 future_lapply 包中的 future.apply 函数,而不是 future_map 包中的 furrr 函数。但是,它们的速度增益也相似。因此,如果您对这里发生的事情有任何建议,我将不胜感激。谢谢!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?