首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >并行r与foreach和mclapply同时应用

并行r与foreach和mclapply同时应用
EN

Stack Overflow用户
提问于 2016-01-10 11:16:07
回答 1查看 1.6K关注 0票数 4

我正在实现一个最终将部署在集群上的并行处理系统,但我很难理解各种并行处理方法是如何交互的。

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

示例伪码:

代码语言:javascript
复制
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个为前额,2个为每个mclapply。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-01-12 14:56:45

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

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

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

请注意,如果使用MPI集群,mclapply可能不会很好地发挥作用。MPI不喜欢像mclapply那样对进程进行分叉。它可能只是发出了一些严厉的警告,但我也看到了other problems,所以我建议使用PSOCK集群,它使用ssh在远程节点上启动工作人员,而不是使用MPI。

更新

看起来,调用由“并行”和“雪”包创建的集群工作人员的mclapply存在问题。有关更多信息,请参见我的answer to a problem report

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34704733

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档