2

我想并行化一个名为 unparallelizedfnc 的函数。该函数调用其他四个函数(计算时间较长)并存储结果。最后将结果合并。考虑我的函数的一个玩具示例(当然,这不是我调用的四个真实函数,仅用于演示)。

如何在具有多核的计算机上并行计算 result1、result2、result3 和 result4?我希望它可以在 Windows、Linux 和 Mac OSX 上运行。在这种情况下,无需对并行化版本进行基准测试(由于开销,它会变慢,但在我的真实代码中它会更快)。

如果四个结果是相同的函数(但具有不同的数据),我可以只使用并行 for 循环(foreach)或并行应用,但在这种情况下,函数是不同的。

unparallelizedfnc <- function(x) {

  result1 <- sum(x)
  result2 <- median(x)
  result3 <- min(x)
  result4 <- max(x)

  result <- mean(c(result1,result2,result3, result4))
  result
}


unparallelizedfnc(rnorm(100000))
4

1 回答 1

6

我首先按照@Jilber 的建议更正了您的功能:

unparallelizedfnc <- function(x) {

  result1 <- sum(x)
  result2 <- median(x)
  result3 <- min(x)
  result4 <- max(x)

  result <- mean(c(result1,result2,result3, result4))
  result
}


parallelizedfnc <- function(x) {
  require(parallel)
  funs <- list(sum,median,min,max)
  mean(do.call("c",mclapply(funs,function(fun) fun(x),mc.cores = 4)))
}

set.seed(42)
x <- rnorm(1e8)
identical(unparallelizedfnc(x),parallelizedfnc(x))
#[1] TRUE

library(microbenchmark)
microbenchmark(unparallelizedfnc(x),parallelizedfnc(x),times=3)

# Unit: seconds
#                 expr      min       lq   median       uq      max neval
# unparallelizedfnc(x) 3.155736 3.166381 3.177027 3.195497 3.213967     3
#   parallelizedfnc(x) 5.047008 5.207747 5.368486 5.514221 5.659956     3

请注意,sum等人。速度太快而无法从并行化中受益。由于并行化开销,该函数需要更多时间。我假设您的实际用例具有较少优化的功能。

于 2013-05-20T17:30:53.187 回答