2013-05-10 21 views
2

调用parLapply()时将多少个列表元素发送给每个工作进程?例如,假设我们有一个包含SOCK群集中的6个元素和2个工作人员的列表。 parLapply()会在一次发送调用中向每个工作人员发送两个列表元素,还是每次发送一个元素?雪是如何向工作人员分发清单元素的?

我想尽量减少我的集群通信开销(我有很多列表元素,可以由每个CPU相对较快地处理),从我在htop CPU计量器上看到的看起来像雪它发送一个列表元素的时间。是否可以设置在一次发送呼叫中分派的列表元素的数量?

回答

4

parLapply功能将输入到每个工人一个块。它是与splitList功能,如在的parLapply的implentation:

function (cl = NULL, X, fun, ...) 
    do.call(c, clusterApply(cl, x = splitList(X, length(cl)), fun = lapply, 
          fun, ...), quote = TRUE) 

因此,与6元和2名的员工名单中,它会发送3个元素给每个工人每一个“发送”操作工人。这是类似的mclapplymc.preschedule设置为TRUE(默认值)的行为。

如此看来,parLapply已经执行所需的优化。

很有趣的是,通过简单地在parLapply定义改变lapplymclapply,您可以创建一个混合并行编程功能,可能与有许多内核的节点工作得非常好。

+0

我同意的结论,但没有证据相信,直到我通过'splitList'到'splitIndices'遵循的代码。 – 2013-05-10 17:44:04

+0

@DWin:也许我应该包括执行'库(雪)的结果; splitList(1:6,2)'作为证据。我永远不知道要进入多少细节。我通常会进入太多... – 2013-05-10 17:55:49

+0

事实上,我完全错过了parLapply代码中的splitList调用。 – 2013-05-10 17:55:50

相关问题