5

以下最小示例...

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)

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

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

如何避免它们?

我在一个包中使用Rmpiand ,这就是我问的原因parallelmclapply请注意,这已发布在这里,但我还没有收到答案(还)。如果这很重要,我会使用 Ubuntu 12.10、Emacs 24 和 R 2.15.2

4

1 回答 1

3

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

在 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)

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

于 2013-11-07T18:44:17.937 回答