r - 同时与 foreach 和 mclapply 并行

标签 r foreach parallel-processing mclapply

我正在实现一个并行处理系统,该系统最终将部署在集群上,但我无法弄清楚各种并行处理方法如何交互。

我需要使用 for 循环来运行一大块代码,其中包含几个大型矩阵操作列表。为了加快速度,我想用 foreach() 并行化 for 循环,并用 mclapply 并行化列表操作。

示例伪代码:

cl<-makeCluster(2)
registerDoParallel(cl)

outputs <- foreach(k = 1:2, .packages = "various packages") {

    l_output1 <- mclapply(l_input1, function, mc.cores = 2)
    l_output2 <- mclapply(l_input2, function, mc.cores = 2)
    return = mapply(cbind, l_output1, l_output2, SIMPLIFY=FALSE)
}

这似乎有效。我的问题是:

1)这是一种合理的方法吗?他们似乎在我的小规模测试中一起工作,但感觉有点笨拙。

2)在任何给定时间它将使用多少个内核/处理器?当我将它升级到集群时,我需要了解我可以推送多少(foreach 只循环 7 次,但 mclapply 列表最多有 70 个左右的大矩阵)。它似乎创建了 6 个“核心”(大概 2 个用于 foreach,2 个用于每个 mclapply。

最佳答案

我认为在集群上这是一种非常合理的方法,因为它允许您在使用多个节点的同时仍然使用更高效的 mclapply跨越各个节点的核心。它还允许您对工作人员进行一些后处理(在这种情况下调用 cbind),这可以显着提高性能。

在一台机器上,您的示例将创建总共 10 个附加进程:两个由 makeCluster 创建。其中每个调用mclapply两次 (2 + 2(2 + 2))。但是,一次只有四个应该使用任何重要的 CPU 时间。您可以通过重组 mclapply 调用的函数将其减少到八个进程。这样您只需调用mclapply一次在 foreach 循环中,这可能更有效。

在多台机器上,您将创建相同数量的进程,但每个节点只有两个进程一次会占用大量 CPU 时间。由于它们分布在多台机器上,因此应该可以很好地扩展。

请注意 mclapply如果您使用 MPI 集群,可能无法正常播放。 MPI 不希望你 fork 进程,如 mclapply做。它可能只是发出一些严厉的警告,但我也看到了other problems ,所以我建议使用 PSOCK 集群,它使用 ssh 在远程节点上启动工作人员,而不是使用 MPI。

更新

调用 mclapply 似乎有问题来自由“parallel”和“snow”包创建的集群 worker 。欲了解更多信息,请参阅我的 answer to a problem report .

关于r - 同时与 foreach 和 mclapply 并行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34704733/

相关文章:

r - 计算 R 函数的最大内存需求

r - 向数据框的所有列添加千位分隔符

php - 在 mysql 更新查询中使用两个具有不同键的数组

Python 多处理和管理器

r - 有人可以解释 R 中的 "compiling"是什么,为什么它会加速这段代码?

如果日期低于 R 中特定行的日期,则返回 NA

Perl foreach 循环遍历一个矩阵行

php - 从这个 while 语句更新 mysql 行的正确 foreach 表达式是什么?

c - 在多线程应用程序中用 C 语言制作目录树

c - 使用标志在线程之间进行通信