1、测试用例基础
mpicxx -g -O3 -DLAMMPS_GZIP -DLMP_USER_OMP -DMPICH_SKIP_MPICXX -DOMPI_SKIP_MPICXX=1 demo.cpp
mpirun --bind-to core --allow-run-as-root -np 6 --mca btl ^openib ./a.out
#include <mpi.h>
#include <stdio.h>
int main( int argc, char *argv[]){
int myrank, npes;
MPI_Init (&argc, &argv); //Initializations
MPI_Comm comm = MPI_COMM_WORLD ;
MPI_Comm_rank (MPI_COMM_WORLD, &myrank);
MPI_Comm_size (MPI_COMM_WORLD, &npes); //MPI RANK,SIZE
printf("i am here\n");
MPI_Finalize();
return(0);
}
2、参考下面进阶版本的实现方法
c - An error occured in MPI_Recv while sending an array - Stack Overflow
[lammps_case_omp]# mpirun --allow-run-as-root -mca pml ucx -mca btl ^vader,tcp,openib,uct -x UCX_TLS=self,sm --bind-to core -np 3 ./a.out
2
Message from process 0 : N=2
Message from process 1 : N=2
Message from process 2 : N=2
Message from process 0 : 0.100000
Message from process 1 : 1.100000
Message from process 2 : 0.000000
3、发现一个奇怪的事情:lammp在某些服务器上,直接使用mpirun --bind-to core --allow-run-as-root -np 128 --mca btl ^openib ./lmp_omp -in equ.in_omp正常,但是封装到shell脚本中执行异常,提示mca_pml_base_open失败
4、Lammps的输入要求reset_timestep 0前必须undump前面的dump, 参考Problem with read_dump command - #12 by akohlmey - LAMMPS General Discussion - Materials Science Community Discourse
5、鲲鹏服务器不支持超线程,需要mpirun -np m -pk omp n (m*n = 128)
time -p mpirun --allow-run-as-root -np 30 -x OMP_NUM_THREADS=4 -x OMP_PROC_BIND=close -map-by ppr:30:node:pe=4 -mca btl ^openib $lammps_exe -sf gpu -pk gpu 2 -in in.elongation_v2.5-bkp -- 并不一定跑满核性能是最佳的(mpi 绑核策略-map-by ppr:30:node:pe=4,omp绑核策略), 参考 Binding/Pinning - HPC Wiki
6、intel mode运行失败
错误1、Cannot yet use airebo/intel with hybrid. (../pair_airebo_intel.cpp:185)
-- 解决方法:airebo是用avx512写的,因此检测不到intel编译器时报错,需要移除airebo相关的文件
错误2:高版本 openmpi 4.1.5 对无效输入报错,低版本 openmpi 4.0.4未报错
-- 解决方法:删除无效的输入,看起来性能没有变化
- env OMP_NUM_THREADS=1 mpirun --allow-run-as-root
-mca btl '^vader,tcp,openib,uct'
-x UCX_TLS=self,sm --bind-to core -np 128 --use-hwthread-cpus lmp_omp -in equ.in -sf omp- 报错现象:amazon web services - Setting BTL flags in OpenMPI - Stack Overflow
7、版本配套关系
knem-1.1.3.tar.gz/ucx-1.5.2.tar.gz/openmpi-4.0.4.tar.gz
8、HMPI 的相关命令
a) -mca btl '^vader,tcp,openib,uct' 禁用ompi中自带的性能较差的组件
b) -mca pml ucx 确保进入ucx层
c) -x UCX_TLS=self,sm 确认传输协议,但结点建议self,sm, 多结点增加rc_x即RDMA协议
9、 运行lammps前先配置export LMP_ROOT=../../../,从而指示从../../..//bench/POTENTIALS/Si.tersoff获取输入文件,否则可能找不到
10、Lammps的intel模式使用的sse源码sse2neon.h接口_mm_undefined_si128中存在未初始化使用,可能有随机的运行时问题
11、网卡配置配置更新,这个可能解决并行度小没有问题,并行度大差错的问题
1、mst start
2、执行以下命令获取端口ID参数。
ibv_devinfo | grep vendor_part_id
vendor_part_id: 4123
3、mlxconfig -d /dev/mst/mt4123_pciconf0 -y s PF_LOG_BAR_SIZE=8
4、reboot
12、在mpi卡住时,可以查看是否有流量 ?
13、-x UCX_TLS=self,sm,rc -i 1 -- 需要最多资源
-x UCX_TLS=self,sm,dc -i 1
-x UCX_TLS=self,sm,ud -i 1 -- 需要资源最少
14、ucx_info 可以查看系统默认的版本,在ib驱动安装时自动带上
15、hmpi 加选项-mca coll ^ucx变成了mpirun的默认功能
a) ucx_info -d 可以查询当前系统支持的协议
b)ompi_info -a 可以查看hmpi的版本信息
16、多结点通讯时需要保证两边环境的二进制及环境变量一致,所以需要在~/.bashrc中使用mount挂载二进制,同时用source来直接配置默认环境变量;-x PATH -x -LD_LIBRARY_PATH传环境变量;
小技巧:可以在mpirun时传ldd确认两边的环境mpirun -N 1 -hostfile xxx ldd wrf.exe
可以通过配置/etc/fstab达成系统启动时的配置
17、ulimit -l 不是查看栈空间是否unlimited, 而需使用 ulimit -a 确认是否配置ulimit -s unlimited
18、hmpi的构建配置
tar -xzvf hmpi-v1.2.1-huawei.tar.gz
cd hmpi-v1.2.1-huawei
./autogen.pl
./configure --prefix=/home/tools/hypermpi-1.2.1 --with-platform=contrib/platform/mellanox/optimized --enable-mpi1-compatibility --with-ucx=$root/hucx
make -j128
19、openforam: https://docplayer.net/124046736-Performance-optimization-of-openfoam-on-knl.html
20、mpirun运行是可以通过-map-by xxx -report-binding看绑核关系
taskset -c 将某个进程绑定指定core: taskset的简单用法--进程绑核_taskset用法-CSDN博客
21、通过yum install numactl-devel 安装 NUMA
yum install -y rdma-core-devel 安装
--with-rdmacm
22、icc的构建配置
LLVM_DIR=/opt/intel/oneapi/compiler/latest/linux
export CC=icc
export CXX=icpc
export FC=ifort
export PATH=${LLVM_DIR}/bin/intel64:$PATH
export LD_LIBRARY_PATH=${LLVM_DIR}/compiler/lib/intel64_lin:$LD_LIBRARY_PATH
23、 ls /sys/devices/system/cpu/ 可以看到多种cpu隔离模式,比如isolated、nohz_full
a) 使用numactl -s查看默认情况下可用的核
b) cat /sys/devices/system/cpu/nohz_full 是看通过 nohz_full 方式被隔离掉了的不能用的核
注意:如果绑核指定的是范围的话,有可能实际只跑在了其中部分核上