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

どうすれば回避できますか?

私はパッケージでRmpiとを使用してparallelいるmclapplyので、私は尋ねています。これはここに投稿されていますが、私はまだ回答を受け取っていないことに注意してください。これが問題になる場合は、Ubuntu 12.10、Emacs 24、およびR2.15.2を使用します

4

1 に答える 1

3

この問題は、OpenMPI1.4.3を使用して構築されたRmpiインストールで発生します。Ubuntuを使用しているので、OpenMPIも使用していると思います。Rmpi呼び出しMPI_Initをロードすると、SIGCHLDシグナルが無視されるのではなくキャッチされます。その結果SIGCHLD、子プロセスがexitによってフォークされたときに送信されるようになり、システムコールがmclapply予期せず中断されると思います。これによって実際のエラーが発生しない場合は、insideを呼び出すことで警告メッセージを防ぐことができます。selectmclapplymclapplysuppressWarnings

この問題については、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 に答える