1

Intel MPI のバージョンは、RHEL マシンにインストールされている impi/5.0.2.044/intel64 です。

次のコードを使用して、Java を使用して MPI プログラムを呼び出しています。

ProcessBuilder builder = new ProcessBuilder();
builder.command("mpirun ./myProgram");
builder.redirectError(Redirect.to(new File("stderr")));
builder.redirectOutput(Redirect.to(new File("stdout")));
Process p = null;
try {
    p = builder.start();
} catch (IOException e) {
    e.printStackTrace();
}
// Process has started here
p.destroy();
try {
    // i = 143
    int i = p.exitValue();
} catch( IllegalThreadStateException e){
}

しかし、exitValue()が例外をスローせずに認識された後でも、ps auxまだ大量の が表示./myProgramされ、プログラムはまだ強制終了されていないかのように結果ファイルを書き込んでおり、すべての計算が終了した後にのみ終了します。

現在、終了に成功した唯一の方法は、コンソールで Java プログラムを./myProgram使用して Java を終了することです。Ctrl+C

私の意図は、計算をすぐに停止し、Java プログラムに他の計算をスケジュールさせることです。すべての mpi インスタンスを強制的に終了させる、または少なくとも一定時間 (30 秒または 1 分間のポーリングなど) で終了することを保証する回避策はありますか?

4

1 に答える 1

2

問題は、 send の JDK 実装がdestroyハードシャットダウンSIGTERMすることです。関連するJDKソースについては、こちらmpirunを参照してください。

SIGINTMPI に正常にシャットダウンする機会を与えるために送信する必要があります。

例えばRuntime.getRuntime().exec("kill -9 <pid>");

mpirunで呼び出すことでPID を取得できます--report-pid。(マンページを読んでください)

編集

代わりに、リフレクションを使用して、UNIX ライクな OS で開始したプロセスの PID を把握することもできます (ここから盗まれます)。kill と signal について話しているので、それは制限ではありません。

if(process.getClass().getName().equals("java.lang.UNIXProcess")) {
  /* get the PID on unix/linux systems */
  try {
    Field f = process.getClass().getDeclaredField("pid");
    f.setAccessible(true);
    pid = f.getInt(p);
  } catch (Throwable e) {
  }
}
于 2015-08-26T11:34:24.333 に答える