我正在实现一个最终将部署在集群上的并行处理系统,但我很难理解各种并行处理方法是如何交互的。
我需要使用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个为前额,2个为每个mclapply。
发布于 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。
https://stackoverflow.com/questions/34704733
复制相似问题