Mpi有多个实现版本,我目前接触到的有intelmpi,mpich2,openmpi。其中HPC默认使用的mpi版本是mpich2,客户经常使用的是openmpi。
整个HPC需要启用NIS服务来管理整个HPC系统的用户,这样登陆其中节点,可以不输入密码直接登陆HPC内部其他服务器,这样mpi可以方便无阻地启动任意服务器的mpi程序。
用户要使用mpich2,首先用自己的账号密码登陆HPC任意服务器节点,使用命令mpdboot -f {计算服务器列表} –n {计算服务器数量}在指定的计算服务器上启动mpi守护进程。待使用完毕,输入mpdallexit退出所有计算服务器上该用户的mpi守护进程。如果要单独启动某个服务器的mpi守护进程,输入mpd &。如果要查看某服务器是否启用mpi守护进程,输入mpdtrace。如果守护进程出现问题,输入mpdallexit,再使用mpdboot命令启动mpi守护进程。没有守护进程的服务器无法启用mpi。
如果使用openmpi,那么无需启动守护进程,直接给定计算节点列表文件、程序和相关参数就可以执行。
Mpi的运行命令为mpirun和mpiexec,通常情况下两者没有区别。Mpi启动命令:mpirun –n{进程数量} –hostfile {计算节点列表} {程序执行命令}。-n和-np是同一个命令;程序执行命令是一个命令,不一定是一个程序名。例如启动一个python程序:mpirun -np 5 -hostfile ./hostfile python ./mpiTest.py。
HPC中为了平衡科学计算的使用率,加入了PBS任务管理调度软件。我们将mpi任务编写进一个pbs任务脚本中去,模板如下:
#PBS -N hello (作业名称)
#PBS -l nodes=clustre1:ppn=12+ clustre2:ppn=12(nodes代表使用几个节点,ppn代表每个节点的核心数)
#PBS -l walltime=12:00:00 (作业运行时间)
#PBS -q batch (作业运行的队列)
#PBS -S /bin/bash
cd $PBS_O_WORKDIR
EXEC=可执行文件的路径
NP=`cat $PBS_NODEFILE | wc -l`#进程数
NN=`cat $PBS_NODEFILE | sort | uniq | tee/tmp/nodes.$$ | wc -l`#计算服务器数
cat $PBS_NODEFILE > /tmp/nodefile.$$#写入计算节点文件
mpdboot -f /tmp/nodefile.$$ -n $NN (启动并行环境)
mpiexec -genv I_MPI_DEVICE rdma-machinefile /tmp/nodefile.$$ -n $NP $EXEC (运行程序,开始计算)
mpdallexit (计算完毕后退出并行环境)
rm -f /tmp/nodefile.$$
然后在任务管理服务器输入qsub hello.pbs启动任务。输入qstat 查询所有任务,每个任务有自己的标号;设任务标号为1,则可输入qstat –n 1查看详细任务信息,输入qdel 1删除标号为1的任务。