2

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

我想最小化我的集群通信开销(我有很多列表元素可以被每个 CPU 相对快速地处理),从我在 htop CPU 仪表上看到的情况来看,它看起来像雪,它当时正在发送一个列表元素。是否可以设置在一次发送调用中调度的列表元素的数量?

4

1 回答 1

5

parLapply函数将输入拆分为每个工作人员的一个块。它通过以下splitList功能实现这一点,如以下所示parLapply

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

因此,对于 6 个元素和 2 个工作人员的列表,它将向每个工作人员发送 3 个元素,每个工作人员都有一个“发送”操作。这类似于mclapplywith mc.prescheduleset to TRUE(默认值)的行为。

因此,它似乎parLapply已经在执行您想要的优化。

有趣的是,通过简单地将的定义更改lapply为,您可以创建一个混合并行编程函数,该函数可能在具有许多内核的节点上工作得很好。mclapplyparLapply

于 2013-05-10T17:32:50.087 回答