Rmpi : mclapply: 在 selectChildren(ac, 1) : 错误“系统调用中断”在选择

Mar*_*ert 5 parallel-processing r

以下最小示例...

require(Rmpi)
set.seed(1)
foo <- parallel::mclapply(seq_len(10), function(l)
                          lapply(1:10, function(x) mean(rnorm(10000, mean=x))),
                          mc.cores=4)
Run Code Online (Sandbox Code Playgroud)

... 产生类型的警告消息

1: In selectChildren(ac, 1) : error 'Interrupted system call' in select
2: In selectChildren(ac, 1) : error 'Interrupted system call' in select
3: In selectChildren(ac, 1) : error 'Interrupted system call' in select
Run Code Online (Sandbox Code Playgroud)

如何避免它们?

我用Rmpiparallelmclapply一个包,这就是为什么我问。请注意,这已张贴在这里,但我还没有收到答复(还)。如果这很重要,我使用 Ubuntu 12.10、Emacs 24 和 R 2.15.2

Ste*_*ton 3

我在使用 Open MPI 1.4.3 构建的 Rmpi​​ 安装中看到了这个问题。我假设您也使用 Open MPI,因为您使用 Ubuntu。加载 Rmpi​​ 调用MPI_Init会导致SIGCHLD信号被捕获而不是被忽略。我相信结果是,当子进程由exitSIGCHLD分叉时,现在将被发送,这会意外中断. 如果这不会导致任何实际错误,您可以通过调用inside来阻止警告消息。mclapplyselectmclapplymclapplysuppressWarnings

Open MPI 用户的邮件列表中对此问题进行了讨论,表明该问题已在 Open MPI 1.6 系列中的某个时刻得到解决,因此解决此问题的最佳解决方案可能是升级您的 MPI 安装(如果尚未升级)。

更新

我使用 Open MPI 1.6.5 和 1.7.3 尝试了您的示例,但问题仍然存在。我决定使用该包来实现一个将信号重置为默认处理的inline函数。SIGCHLD使用它,我可以运行您的示例而不会生成任何警告:

library(Rmpi)
library(inline)
includes <- "#include <signal.h>"
code <- "signal(SIGCHLD, SIG_DFL);"
ignchld <- cfunction(body=code, includes=includes, convention=".C")
ignchld()
foo <- parallel::mclapply(seq_len(10), function(l)
                          lapply(1:10, function(x) mean(rnorm(10000, mean=x))),
                          mc.cores=4)
Run Code Online (Sandbox Code Playgroud)

当然,禁用信号可能会给Rmpi带来一些问题。在这种情况下,您可以修改代码来保存和恢复处理程序SIGCHLD,但我不知道这是否有必要。