环境配置
超算:并行云:济南超算
Makefile
编译:只加载intel编译器及其mpi模块,其他不动,不然makefile
报错
source /es01/paratera/parasoft/module.sh # 加载module命令
module load mpi/intel/17 # 加载intel编译器及其对应mpi环境
程序编译
- 版本:
opencfd2d-1.5.5
unzip
解压缩,进入对应目录,make
编译,正确加载module时编译不报错,opencfd2d-1.5.5.out
即为可执行文件。./util/
目录:常用工具
文件名 | 作用 |
---|---|
Jac2d-v1.1.f90 | 读入 PLOT3D 格式的网格文件,生成 opencfdsc 格式的网格文件 |
init2d-freestream-1.1.f90 | 用来流值生成初值 |
read-flow2d.f90 | 读入opencfd-sc格式流场,输出tecplot 格式流场 |
read-flat2d.f90 | |
init2d-tunnel.f90 |
应用实例
- 示例文件:
sc2d/cylinder/
,二维圆柱绕流, M a = 1.5 Ma=1.5 Ma=1.5, R e = 1 0 4 Re=10^4 Re=104 opencfd2d.in
:控制文件
- 编译并运行
mesh-cylinder-sc2d-1.0.f90
生成网格,得到网格文件mesh2d.dat
mpif90 mesh-cylinder-sc2d-1.0.f90 -o mesh-cylinder # 编译
./mesh-cylinder # 运行
- 编译并运行
Jac2d-v1.1.f90
生成Jocabian变换数据(需要输入flag=1
,nx=101
,ny=400
),得到OCFD2d-Jacobi.dat
和grid-tec.dat
mpif90 Jac2d-v1.1.f90 -o Jac2d
./Jac2d
- 编译并运行
init2d-freestream-1.1.f90
生成初值(需要输入nx=101
,ny=400
,攻角0)
mpif90 init2d-freestream-1.1.f90 -o init2d-freestream
./init2d-freestream
ln –s flow2d0.dat opencfd2d.dat
,创建软链接opencfd2d-1.5.5.out
复制到当前路径,mpirun –n 16 ./opencfd2d-1.5.5.out
。超算提交作业见下文。- 后处理:
opencfd2d.dat
由初值文件重新链接为所需时刻的文件
rm opencfd2d.dat
ln -s OCFD2d-0100000.dat opencfd2d.dat
编译并运行 read-cylinder.f90
生成 tecplot 格式的流场文件flow2d.dat
, 可用 tecplot 绘图。
ifort read-cylinder.f90 -o read-cylinder # mpif90可能句子太长会报错
./read-cylinder
超算命令
登录节点仅供编译软件、 拷贝数据,勿在登录节点运行程序。
命令 | 功能 |
---|---|
lfs quota -uh $USER ~ | 查看存储情况 |
sinfo | 系统资源使用 |
squeue | 作业运行状态 |
srun -p 分区 | 交互式提交作业,有屏幕输出,受网络波动影响 |
sbatch -p 分区 | 后台提交作业 |
scancel | 取消已提交的作业 |
scontrol | 查看正在运行的作业信息 |
sacct -D -X -j jobnum | 查看历史作业信息 |
提交作业
1. sbatch + mpirun
编写脚本文件cylinder.sh
,-n
指定进程数,一般希望是单结点核数56的整数倍,但是要和程序所需的核数匹配,见opencfd2d.in
。
#!/bin/bash
#SBATCH -N 1
#SBATCH -n 16
mpirun -n 16 ./opencfd2d-1.5.5.out
这边用mpirun
可以正常运行,但是mpirun
虽然-n 16
,但是scontrol show job
或sacct -D -X -j jobnum
查看作业的话只分配了一个核。原因是#SBATCH
中间不能有空格,不能写成# SBATCH
。
命令行提交脚本作业,-p
指定分区。
sbatch -p G1Part_sce cylinder.sh
sbatch
默认输出日志为提交目录下的slurm-xxx.out
文件,tail -f slurm-xxx.out
实时查看日志。
2. 直接srun
提交
而用srun
会报MPI相关错误。
$ srun -p G1Part_sce -N 1 -n 16 opencfd2d-1.5.5.out
Fatal error in MPI_Init: Other MPI error, error stack:
MPIR_Init_thread(805).....: fail failed
MPID_Init(1832)...........: channel initialization failed
MPIDI_CH3_Init(126).......: fail failed
MPID_nem_init_ckpt(836)...: fail failed
MPIDI_CH3I_Seg_commit(427): PMI_KVS_Get returned -1
......
原因可能是srun
对Intel MPI的调度问题。Intel MPI支持pmi2,所以加--mpi=pmi2
即可调用多核。
$ srun --mpi=list
srun: MPI types are...
srun: openmpi
srun: pmi2
srun: none
$ srun --mpi=pmi2 -p G1Part_sce -N 1 -n 16 opencfd2d-1.5.5.out
3. sbatch + srun
但是--mpi=pmi2
选项放到.sh
文件后运行sbatch
仍不行。设置PMI库的环境变量
$ echo $I_MPI_PMI_LIBRARY
/usr/lib64/libpmi.so
$ export I_MPI_PMI_LIBRARY=/usr/lib64/libpmi2.so
用sbatch
在.sh
文件中使用srun
调用mpirun
,但仍无法运行。
#!/bin/bash
#SBATCH -N 1
#SBATCH -n 16
srun -n 16 opencfd2d-1.5.5.out
在把PMI这个变量改回去就可以了,很怪,但是实验2次都是这样。
$ export I_MPI_PMI_LIBRARY=/usr/lib64/libpmi.so
$ sbatch -p G1Part_sce cylinder.sh
参考:
https://stackoverflow.com/questions/62502324/job-fails-while-using-srun-or-mpirun-in-slurm
https://slurm.schedmd.com/mpi_guide.html#intel_mpi
https://hpclib.com/hpc/Scheduler/Slurm/mpi_guide.html
注意:设置的核数需要和控制文件中需要的核数npx0*npy0
相同,不然报错
srun: error: nable to create step for job 11412745: More processors reuested than permitted
参考
http://pan.baidu.com/s/1slfC5Yl
OpenCFD使用手册、理论手册
《OpenCFD2d教学示例》
《并行科技用户济南超算使用手册》