【发布时间】: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_FUNNELED和MPI_THREAD_SERIALIZED,这意味着只要不是从多个线程同时调用 MPI,它就可以正常工作。
标签: multithreading jvm cluster-computing openmpi hpc