1

我的 Intel MPI 版本是 impi/5.0.2.044/intel64 安装在 RHEL 机器上。

我正在使用 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,并且程序仍在写入结果文件,就好像它没有被杀死一样,只有在完成所有计算后才会终止。

目前,我发现成功终止的唯一方法./myProgramCtrl+C将控制台中使用的 java 终止到 java 程序。

我的意图是立即停止计算,让 java 程序安排一些其他的计算。是否有任何解决方法可以强制所有 mpi 实例终止,或者至少保证在小而明确的时间内(例如 30 秒或 1 分钟的轮询)终止?

4

1 回答 1

2

问题是 JDK 实现的destroy发送,它很难SIGTERM关闭。mpirun有关相关的 JDK 源,请参见此处

您需要发送SIGINT以使 MPI 有机会正常关闭。

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

mpirun您可以通过调用来获取 PID --report-pid。(阅读手册页)

编辑

您也可以使用反射来计算您在类 UNIX 操作系统下启动的进程的 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 回答