调用 parLapply() 时向每个工作进程发送了多少列表元素?例如,假设我们在雪 SOCK 集群上有一个包含 6 个元素和 2 个工作人员的列表。parLapply() 是在一次发送调用中向每个工作人员发送两个列表元素,还是每次发送一个元素?
我想最小化我的集群通信开销(我有很多列表元素可以被每个 CPU 相对快速地处理),从我在 htop CPU 仪表上看到的情况来看,它看起来像雪,它当时正在发送一个列表元素。是否可以设置在一次发送调用中调度的列表元素的数量?
调用 parLapply() 时向每个工作进程发送了多少列表元素?例如,假设我们在雪 SOCK 集群上有一个包含 6 个元素和 2 个工作人员的列表。parLapply() 是在一次发送调用中向每个工作人员发送两个列表元素,还是每次发送一个元素?
我想最小化我的集群通信开销(我有很多列表元素可以被每个 CPU 相对快速地处理),从我在 htop CPU 仪表上看到的情况来看,它看起来像雪,它当时正在发送一个列表元素。是否可以设置在一次发送调用中调度的列表元素的数量?
该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
with mc.preschedule
set to TRUE
(默认值)的行为。
因此,它似乎parLapply
已经在执行您想要的优化。
有趣的是,通过简单地将的定义更改lapply
为,您可以创建一个混合并行编程函数,该函数可能在具有许多内核的节点上工作得很好。mclapply
parLapply