【问题标题】:reducing number of JVM's used by mpi减少 mpi 使用的 JVM 数量
【发布时间】:2015-05-30 06:21:17
【问题描述】:

我正在使用MPI 编写一个在HPC 上运行的Java 程序,但我感觉我在浪费资源,因为open-mpi 的工作方式。我实际上并不确定它是如何工作的,但我假设mpirun -n 10 java myProgram.java 在不同的节点/核心/等上启动了 10 次 myProgram。 (取决于绑定)每次。这也意味着,就我对 JVM 的理解而言,有 10 个 JVM 正在运行。

在对我的程序进行一些测试运行后,使用默认设置(绑定到核心并在 1 个节点上尽可能多地打包所有内容),我意识到内存使用率非常低,并得出结论我必须这样做关于 JVM 的多样性。我试图放松从核心到节点的绑定,但是我没有使用所有可能的处理能力。我也已经尝试使用多线程来解决这个问题,但我读到 (somew)here 这也不是最好的想法之一(但我仍在尝试寻找解决方法)。

所以我的问题是:
是否存在使用 open-mpi 将每个节点与仅一个 JVM 链接的方法?
替代方法:如何我可以更好地利用内存吗?

提前致谢

【问题讨论】:

  • documentation of open-mpi 指定 open-mpi 有一个 java 接口。它提供了一个包装的编译器mpijavac,并且 mpirun 已更新以检测 java 命令。要构建这个接口,open-mpi 必须已经配置了--enable-mpi-java:你做到了吗?你可以试试--showme 选项来检查 mpirun 是否对应于 open-mpi ?
  • 我确实这样做了,但由于这些命令中的大多数只是包装器,我假设我得到的 JVM 与使用 -n 标志定义的进程一样多。我仍然只是假设,因为我找不到包装器是否会为 java 优化任何东西。
  • 是的,您确实获得了与 MPI 等级一样多的 JVM。这就是 MPI 的全部意义 - 可移植的 进程间 通信(虽然标准中没有特别说明,但几乎所有流行的 MPI 实现都将等级视为单独的进程)。如果每个 MPI 进程启动一个 JVM 太多,您应该使用混合,即将线程编程与 MPI 混合。
  • 真的没有其他方法可以达到相同/相似的结果吗?我已经尝试过混合,但 open-mpi 似乎并不完全支持这一点(请参阅我在问题中链接到的对话)。
  • Open MPI 完全支持MPI_THREAD_FUNNELEDMPI_THREAD_SERIALIZED,这意味着只要不是从多个线程同时调用 MPI,它就可以正常工作。

标签: multithreading jvm cluster-computing openmpi hpc


【解决方案1】:

正如 Hristo Iliev 在 cmets 中已经提到的,混合方法解决了我的问题。为了避免使用MPI_THREAD_MULTIPLE,我静态地分发了工作。然后可以使用mpirun --map-by ppr:1:node --bind-to board java <java-program> 运行程序,以限制在一个节点上运行的进程数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 2022-08-15
    • 2010-10-09
    • 1970-01-01
    • 2015-11-27
    • 1970-01-01
    相关资源
    最近更新 更多