Multithreading 减少JVM的数量';mpi使用的是什么

Multithreading 减少JVM的数量';mpi使用的是什么,multithreading,jvm,cluster-computing,openmpi,hpc,Multithreading,Jvm,Cluster Computing,Openmpi,Hpc,我正在用java编写一个程序,用它在HPC上运行,但我有一种感觉,因为它的工作方式,我在浪费资源。实际上,我并不确定它是如何工作的,但我假设mpirun-n10javamyprogram.java每次在不同的节点/核心等(取决于绑定)上启动myProgram 10次。这也意味着,就我对JVM的理解而言,有10个JVM正在运行 在对我的程序进行了一些测试运行之后,使用默认设置(绑定到内核并在1个节点上尽可能多地打包所有内容),我意识到内存使用非常差,并得出结论,我必须对JVM的多样性做些什么。我试

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

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

所以我的问题是:
是否有一种方法可以使用open mpi将每个节点仅与一个JVM链接?
备选方案:如何更好地利用内存


提前感谢

如评论中所述,混合方法解决了我的问题。为了避免使用
MPI\u THREAD\u MULTIPLE
,我静态地分配了工作。然后可以使用
mpirun--map by ppr:1:node--bind to board java运行该程序,以限制在一个节点上运行的进程数。

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