从多个节点检测核心数

3
我有一个用R语言编写的脚本,利用了doParallel包和并行化的foreach函数。我当前通过使用detectCores()命令的变体来注册我的群集,在我使用的机器上非常有效,因为它有32个内核。
我的问题是,如果我可以访问具有多个Linux机器的HPC资源,是否可以从多个机器上检测内核数,并在单个foreach调用中实现它们?
例如,如果我提交我的HPC作业以便它使用两个节点,那么是否可能使detectCores()函数产生一个值为64而不是32?

1
例如,parallel::makeCluster(c("n1", "n1", "n1" "n2", "n3")) 将在 n1 上设置一个 (PSOCK) 集群,其中有 3 个工作进程,在 n2 上有 1 个工作进程,在 n3 上也有 1 个工作进程。 - HenrikB
1
{btsdaf} - amelcher
@JuKo 我相信这正是被接受的答案所做的。你会在作者的“find_workers”函数中看到这一行 ns <- clusterCall(cl, fun = detectCores)。这一行获取了集群中每个节点上的核心数。将它们相加,你就可以得到可用的总核心数。请记住,我认为使用 makeCluster() 命令时可以使用的工作进程数量是有限制的。我不记得确切的数字是多少。我想它是128。当我做这项工作时已经过了一段时间! - amelcher
我明白了,感谢您的澄清!如果我理解正确的话,使用mclapply()无法同时使用多个节点的核心,必须改用parlapply()是吗? - Ju Ko
我相信这是正确的。我相信mclapply()仅使用单台机器上的核心。 - amelcher
显示剩余3条评论
1个回答

2

以下是置顶帖评论中的示例总结解决方案:

library("parallel")

find_workers <- function(nodes) {
  nodes <- unique(nodes)
  cl <- makeCluster(nodes)
  on.exit(stopCluster(cl))

  ns <- clusterCall(cl, fun = detectCores)
  rep(nodes, times = ns)
}

workers <- find_workers(c("n1", "n2", "n3"))
cl <- makeCluster(workers)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接