Snow如何将列表元素分配给worker?

Rob*_*ick 2 parallel-processing r snow

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

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

Ste*_*ton 5

该parLapply函数将输入分成每个工作程序的一个块。它使用该splitList函数来实现这一点,如以下的实现所示parLapply:

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

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

所以看起来parLapply已经在执行你想要的优化了。

有趣的是,只需在 的定义中更改lapply为,您就可以创建一个混合并行编程函数,该函数可能与具有多个内核的节点配合得很好。mclapplyparLapply