gpt4 book ai didi

Rmpi : mclapply: In selectChildren(ac, 1) : 选择错误 'Interrupted system call'

转载 作者:行者123 更新时间:2023-12-04 09:34:28 26 4
gpt4 key购买 nike

以下最小示例...

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

如何避免它们?

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

最佳答案

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

有一个 discussion of this issue在 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处理程序,但我不知道是否有必要。

关于Rmpi : mclapply: In selectChildren(ac, 1) : 选择错误 'Interrupted system call',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14149361/

26 4 0
文章推荐: polymer - 使用