gpt4 book ai didi

r - 同时与 foreach 和 mclapply 并行

转载 作者:行者123 更新时间:2023-12-02 01:30:15 25 4
gpt4 key购买 nike

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

我需要使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com