调用parLapply()时,每个工作进程发送了多少列表元素?例如,假设我们在雪SOCK集群上有6个元素和2个工作者的列表。 parLapply()是否在一个发送调用中向每个worker发送两个列表元素,或者它是否每次发送一个元素?
我想最小化我的集群通信开销(我有许多列表元素可以由每个CPU相对快速地处理),并且从我在htop CPU上看到的表看起来像雪,它当时正在发送一个列表元素。是否可以设置在一次发送呼叫中调度的列表元素的数量?
答案 0 :(得分:4)
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个元素,每个工作者只需一次“发送”操作。这类似于mclapply
mc.preschedule
设置为TRUE
(默认值)的行为。
所以似乎parLapply
已经在执行您想要的优化。
有趣的是,通过在lapply
的定义中简单地将mclapply
更改为parLapply
,您可以创建一个混合并行编程函数,该函数可以很好地与具有许多节点的节点一起使用芯