程序的并行一般有两种方式,多线程和多进程。即OpenMP(共享内存)和MPI(分布式)。OpenMP为编译器自带,编译时加上对应参数即可。 如:
gfortran -fopenmp,ifort -qopenmp。MPI并行库需要额外提供,有Intel MPI,OpenMPI,mvapich(基于mpich增加了IB网络的支持)。 气象海洋模式的大规模并行计算都是用到上百个节点,而程序里并行代码都已经给定。我们做的就是根据具体的服务器,编译环境,并行库, 测试出一个计算速度最快,使用核数适中的方案。
现在大部分超算都是Intel处理器,而Intel编译器针对它做了一定优化。但是部分版本Intel compiler编译出的模式存在一些问题,比如运行时core dump,以及并行效率不高等等。所以建议使用最新update版本,比如2017update5,2018update3等。对于一些必要的库,如hdf5,netcdf。可以静态编译进去,这样模式很容易迁移到其他集群上去。不用去安装编译器和库来重新编译(前提是glibc一致)。具体做法为:
WRF模式
修改configure.wrf中的LIB_EXTERNAL,改为如下形式:
LIB_EXTERNAL = \
-L$(WRF_SRC_ROOT_DIR)/external/io_netcdf -lwrfio_nf /netcdfpath/lib/libnetcdff.a \
/netcdfpath/lib/libnetcdf.a /hdf5path/lib/libhdf5_fortran.a /hdf5path/lib/libhdf5_hl.a \
/hdf5path/lib/libhdf5.a /usr/lib64/libz.a -ldl 其中netcdfpath,hdf5path分别为netcdf,hdf5的安装路径。
修改external/io_netcdf/makefile中的LIBS和LIBFFS,改为如下形式:
LIBS = $(LIB_LOCAL) -L$(NETCDFPATH)/lib /netcdfpath/lib/libnetcdff.a /netcdfpath/lib/libnetcdf.a \
/hdf5path/lib/libhdf5_fortran.a /hdf5path/lib/libhdf5_hl.a \
/hdf5path/lib/libhdf5.a /usr/lib64/libz.a -lm -ldl
LIBFFS = $(LIB_LOCAL) -L$(NETCDFPATH)/lib /netcdfpath/lib/libnetcdff.a /netcdfpath/lib/libnetcdf.a \
/hdf5path/lib/libhdf5_fortran.a /hdf5path/lib/libhdf5_hl.a \
/hdf5path/lib/libhdf5.a /usr/lib64/libz.a -lm -ldl得到的wrf.exe依赖如下:
wang@localhost$ ldd wrf.exe
linux-vdso.so.1 => (0x00007ffd7618c000)
libdl.so.2 => /lib64/libdl.so.2 (0x00002b5ff2eda000)
libmpifort.so.12 => /app/intel/compilers_and_libraries_2018.3.222/linux/mpi/intel64/lib/libmpifort.so.12 (0x00002b5ff30de000)
libmpi.so.12 => /app/intel/compilers_and_libraries_2018.3.222/linux/mpi/intel64/lib/libmpi.so.12 (0x00002b5ff3487000)
librt.so.1 => /lib64/librt.so.1 (0x00002b5ff4116000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b5ff431e000)
libm.so.6 => /lib64/libm.so.6 (0x00002b5ff453a000)
libiomp5.so => /app/intel/compilers_and_libraries_2018.3.222/linux/compiler/lib/intel64/libiomp5.so (0x00002b5ff483c000)
libc.so.6 => /lib64/libc.so.6 (0x00002b5ff4c17000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00002b5ff4fe4000)
/lib64/ld-linux-x86-64.so.2 (0x00002b5ff2cb6000)FVCOM模式
思路和WRF模式编译一致,链接时写静态库的全路径。具体做法如下:
修改make.inc中的IOLIBS:
IOLIBS = -L. /netcdfpath/lib/libnetcdff.a /netcdfpath/lib/libnetcdf.a \
/hdf5path/lib/libhdf5_fortran.a /hdf5path/lib/libhdf5_hl.a
/hdf5path/lib/libhdf5.a /usr/lib64/libz.a -lm -ldl得到的fvcom为:
wang@localhost$ ldd fvcom
linux-vdso.so.1 => (0x00007ffd96156000)
libm.so.6 => /lib64/libm.so.6 (0x00002b0ec362b000)
libdl.so.2 => /lib64/libdl.so.2 (0x00002b0ec392d000)
libmpifort.so.12 => /app/intel/compilers_and_libraries_2018.3.222/linux/mpi/intel64/lib/libmpifort.so.12 (0x00002b0ec3b31000)
libmpi.so.12 => /app/intel/compilers_and_libraries_2018.3.222/linux/mpi/intel64/lib/libmpi.so.12 (0x00002b0ec3eda000)
librt.so.1 => /lib64/librt.so.1 (0x00002b0ec4b69000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b0ec4d71000)
libc.so.6 => /lib64/libc.so.6 (0x00002b0ec4f8d000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00002b0ec535a000)
/lib64/ld-linux-x86-64.so.2 (0x00002b0ec3407000)
WRF之类有限差分模式,并行计算主要体现在空间差分上,所以他所使用的核数=X方向的核数乘以Y方向核数。而FVCOM有限体积模式,
并行时需要把空间分为几个区域(区域数即核数),与模拟的空间大小分辨率等有很大关系,需要具体测试。
集群中一个节点相当于一台计算机,按功能其类型主要有,用户节点,控制节点,管理节点,存储节点,计算节点。
- 用户节点
即登录节点,用户在这些节点提交作业。一般可以访问外网,下载数据。而且安装了许多实用的小工具。譬如:wget,axel,imagemagick,htop。 如果没有装,后面讲在集群安装软件的方法。
- 控制节点
调度计算节点上的作业,通常集群的作业调度程序(如PBS)应该运行在这个节点上。但大多集群的登录节点,或管理节点同时负责作业调度。
- 管理节点
也就是mgt节点,监控集群中各个节点和网络的运行状况。通常的集群的管理软件也运行在这个节点上。一般只能root才能登录,没有挂载并行文件系统。
- 存储节点
也叫IO节点,这些节点上挂载了TB级的并行文件系统,然后共享到其他节点。如果这些节点挂载出问题,那么其他节点并行文件系统也就不能用了。
- 计算节点
计算节点是整个集群系统的计算核心。它的功能就是执行计算。一般一个节点10几到20几核不等。
节点间一般是通过以太网来实现tcp通信。但是如果并行计算,这种千兆以太网的速度是远远不够的。所以现在大多集群并行计算都是通过IB网络来通信,
速度达到了56Gb/s。并行程序执行时的通信结构有如下方式:shm|dapl|tcp|tmi|ofa|ofi。shm为共享内存,tcp为以太网,ofa为IB网络。
有用的命令:ibstat, ibstatus, ip addr, ip link
Intel MPI运行参数。
version:2018update3
FVCOM模式运行时,设置环境变量export I_MPI_FABRICS=shm:ofa。节点内共享内存,节点间IB网络。
经测试这种搭配是效率最高的。WRF模式对这个设置不敏感,I_MPI_FABRICS=shm:ofa和I_MPI_FABRICS=ofa速度基本一致,后者为节点内,节点间都用IB网络。
OpenMPI运行参数。
version:2.1.5
OpenMPI文档中讲,从v1.8系列开始,vader BTL就替代了sm BTL,这两者都是节点内共享内存通信。测试发现vader BTL速度要快一些。
mpirun -np 20 --mca btl vader,openib ./a.out即只使用vader,openib通信方式。如果不使用某一方式,用^指定。
mpirun -np 20 --mca btl ^tcp,openib ./a.out即不包含tcp方式。OpenMPI默认是根据网络拓扑关系来自动识别并行的通信方式,一般不用指定相关参数。
mpich运行参数。
version:3.2
mpiexec -iface ib0 -n 4 ./a.outmpich默认节点间使用tcp方式,需强制改为IB通信方式。
最后想说的是,这些MPI库执行标准都一样,所以相同编译器和通信方式下,这些MPI库的计算速度相差很小。
常用的命令,适用于PBS-Pro,torque。
qmgr -c "p s"
查看队列配置
qstat
查看作业状态,可用参数-a,-n,s
showq
查看作业状态,为maui软件中的命令
qsub
提交作业
pbsnodes
pbsnodes -a,查看各节点状态,衍生命令为pestat
qdel
删除作业,qdel + 作业号