Rmpi:mclapply:In selectChildren(ac,1):错误';中断的系统调用';选择

Rmpi:mclapply:In selectChildren(ac,1):错误';中断的系统调用';选择,r,parallel-processing,R,Parallel Processing,下面是一个简单的例子 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) 如何避免它们 我在一个包中使用Rmpi和parallel的mclappy,这就是

下面是一个简单的例子

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)
如何避免它们


我在一个包中使用
Rmpi
parallel
mclappy
,这就是为什么我要问这个问题。请注意,这已经发布,但我还没有收到答复(尚未)。在这种情况下,我使用Ubuntu12.10、Emacs24和R2.15.2

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

OpenMPI用户的邮件列表中有一个问题,表明该问题在OpenMPI 1.6系列中的某个点上得到了修复,因此,如果尚未升级MPI安装,则最好的解决方案可能是升级MPI安装

更新

我使用OpenMPI 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)
库(内联)
包括非常感谢,这是有用的(因为我仍然有这个问题)。
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)