如何并行化具有多个参数的函数?

时间:2016-10-10 01:54:34

标签: r parallel-processing simulation cpu-cores

我有一个特殊的模拟要执行,这需要一些时间在R中运行。由于我想执行1000次模拟,我决定使用“并行”包来分配这些模拟超过4个核心。我知道如果我有一个像下面这样的函数,我可以得到一个结果向量。

results_parallel <- parSapply(cl, c(1000,1000,1000,1000), rnorm)

在这里,rnorm()只有一个参数作为输入,因此我可以要求使用4个核心生成4000个值。

但我的模拟有多个参数。我的问题是,由于我有多个参数作为输入,如何判断应使用4个核心计算哪个参数?如果simulation1(A,B,C,m)是我的函数,其中m是模拟的数量,我想让每个核心进行250次模拟,这样我最终可以得到1000次模拟。谁能给我一个提示?

2 个答案:

答案 0 :(得分:4)

你可以尝试创建一个函数包装器,它接受一个参数而不是多个参数。

rnorm1 <- function(ls){
  rnorm(n = ls$n, mean = ls$mean, sd = ls$sd)
}

cl <- makeCluster(2)

example_list <- list(
      list(n=1000, mean = 0, sd = 1),
      list(n=1000, mean = 1, sd = 2)
)

results_parallel <- parSapply(cl, example_list, rnorm1)

您只需指定所需的参数列表,以便它是列表列表。

答案 1 :(得分:1)

我不确定这正是您所追求的,但您应该能够在函数调用中添加要传递给rnorm的参数。我之前没有使用parSapply,但这里是llply

doMC::registerDoMC( cores = 4 )
results <- plyr::llply( .data = c(1000,1000,1000,1000),
                        .fun = rnorm, mean = 1, sd = 0.4,
                        .parallel = T 
)

请注意mean调用中传递给sd的参数rnormllplyparSapply应该能够以同样的方式处理这个问题。例如:

results_parallel <- parSapply( cl, 
                               X = c(1000,1000,1000,1000), 
                               FUN = rnorm, mean = 1, sd = 0.4 
)
相关问题