我正在实现一个并行处理系统,该系统最终将部署在集群上,但我无法弄清楚并行处理的各种方法如何交互。
我需要使用 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 个“核心”(大概是 foreach 2 个,每个 mclapply 2 个)。
我认为这是集群上非常合理的方法,因为它允许您使用多个节点,同时仍然使用更高效的节点mclapply
跨各个节点的核心。它还允许您对工作人员进行一些后处理(调用cbind
在这种情况下)这可以显着提高性能。
在一台机器上,您的示例将创建总共 10 个附加进程:两个由makeCluster
每个调用mclapply
两次 (2 + 2(2 + 2))。然而,一次只有四个应该使用大量的 CPU 时间。您可以通过重组调用的函数将其减少到八个进程mclapply
这样你只需要打电话mclapply
一旦进入 foreach 循环,这可能会更有效。
在多台计算机上,您将创建相同数量的进程,但每个节点一次只有两个进程会使用大量 CPU 时间。由于它们分布在多台机器上,因此应该可以很好地扩展。
意识到mclapply
如果您使用 MPI 集群,可能效果不佳。 MPI 不喜欢您分叉进程,因为mclapply
做。它可能只是发出一些严厉的警告,但我也看到了其他问题 https://stackoverflow.com/a/19844099/2109128,所以我建议使用 PSOCK 集群,它使用 ssh 在远程节点上启动工作程序,而不是使用 MPI。
Update
看来调用有问题mclapply
来自由“parallel”和“snow”包创建的集群工作人员。欲了解更多信息,请参阅我的对问题报告的答复 https://stackoverflow.com/a/35509767/2109128.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)