首页 > 技术文章 > MPI java多线程

bxf0011 2021-03-03 18:21 原文

我的计算机是24核的工作站,想进行并行计算。现在有两种选择:java的多线程和MPICH+mpiJava的MPI编程。请问二者有什么区别呢?哪个会更快一点?我搜了一下,好像说MPI是多进程的,这是不是说MPI能更好的利用多个CPU?假如我用了20个线程的话,java多线程编程能不能把计算任务分配到20个CPU上啊?

  

如果bai是单节点的,利用多线程的就du可以了。mpi一般zhi使用在多dao节点上的,就zhuan是好几个工作站一起计shu算的时候,采用mpi实现。
多线程操作系统是自动分配cpu的,可以实现一台电脑上的分配。
mpi的通讯在以电脑上的速度肯定比不上多线程的,因为线程的通讯可以基于共享内存的。
java并行计算 JAVA的MPI---MPJ

  

mpirun -np部分决定vasp程序实际使用多少个节点并行

  

1.MPI全称是message passing interface,即信息传递接口,是用于跨节点通讯的基础软件环境。它提供让相关进程之间进行通信,同步等操作的API,可以说是并行计算居家出游必备的基础库。

一个 MPI 程序包含若干个进程。每个 mpi 进程都运行一份相同的代码,进程的行为由通讯域(communication world)和该通讯域下的 id(rank id)所决定。

MPI的编程方式,是“一处代码,多处执行”。编写过多线程的人应该能够理解,就是同样的代码,不同的进程执行不同的路径。

2.它是一个库,不是一门语言。可以被fortran,c,c++等调用。MPI允许静态任务调度,显示并行提供了良好的性能和移植性,用MPI编写的程序可直接在多核集群上运行。在集群系统中,集群的各节点之间可以采用 MPI 编程模型进行程序设计,每个节点都有自己的内存,可以对本地的指令和数据直接进行访问,各节点之间通过互联网络进行消息传递,这样设计具有很好的可移植性,完备的异步通信功能,较强的可扩展性等优点。

3.MPI常用命令

对于登录集群计算而言,我们只需要掌握两种mpi运行指令即可,它们分别是:mpirunmpiexec

简而言之mpirunmpiexec均是MPI程序运行命令:

  • mpirun :MPI程序快速执行命令,运行前不必运行mpdboot开启守护进程。
  • mpiexec:MPI程序运行命令,运行前必须开启mpd守护进程。

守护进程(daemon)是一类在后台运行的特殊进程,用于执行特定的系统任务。很多守护进程在系统引导的时候启动,并且一直运行直到系统关闭。另一些只在需要的时候才启动,完成任务后就自动结束。

简单来说,在服务器配置良好的情况下,绝大多数情况不需要考虑选项的配置,基本语句如下:

mpirun -n 20 vasp_std //20核心并行vasp_std程序,vasp_std需要加入环境变量

mpiexec.hydra -n 20 vasp_std //20核心并行vasp_std程序,vasp_std需要加入环境变量

此时节点和核心的分配完全由PBS系统进行分配,跨节点运行时也会自动进行核心和节点的匹配

另外,在实际操作过程中,我发现部分同学对于PBS和mpirun -np的作用可能不太理解,在这里想简单解释如下:

  1. PBS是作业分配系统,通过.pbs脚本像PBS作业管理软件申请相应的核心数量和节点数量。
  2. 但要注意,这并不意味着通过分配的作业会完全按照申请的资源运行。下面看一个小小的例子:
1
2
3
#PBS -l nodes=2:ppn=20 

mpirun -np 30 vsap_std //30核心并行vsap_std程序

这意味着#PBS -l命令部分决定问集群申请多少计算资源。

推荐阅读