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)