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

How to parallelize a function which has more than one parameter?

我有一个特定的模拟要执行,这需要一些时间才能在 R 中 运行。因为我想执行 1000 次模拟,所以我决定使用 "parallel" 包将这些模拟分布在 4 个内核上.我知道如果我有如下函数,我可以获得结果向量。

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

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

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

您可以尝试创建一个采用单个参数而不是多个参数的函数包装器。

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)

您只需指定所需的参数列表,使其成为列表的列表。

我不确定这是否正是您想要的,但您应该能够在函数调用中添加要传递给 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 
)

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

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