如何编写Shell脚本实现Fortran计算任务的节点排队提交?
解决SLURM脚本未运行Fortran计算任务的问题
问题现象
提交SLURM脚本后,任务仅输出节点信息及起止时间,未执行Fortran计算程序,输出内容如下:
Job start at Thu Mar 2 17:58:30 -03 2023 n20 1 Job end at Thu Mar 2 17:58:32 -03 2023
原脚本内容:
#!/bin/bash #SBATCH --job-name=calculos #SBATCH --partition=cempa #SBATCH --nodes=1 #SBATCH --tasks-per-node=20 #SBATCH --ntasks=1 #SBATCH --time=10:00:00 #SBATCH --error=error_output_sbatch_%j.txt #SBATCH --output=error_output_sbatch_%j.txt #SBATCH --exclusive echo "Job start at $(date)" module unload openmpi3 module load gnu8 #Exibe os nós alocados para o Job echo $SLURM_JOB_NODELIST echo $SLURM_JOB_NUM_NODES # Operations export OMP_NUM_THREADS=1 EXEC=./calculos_jan.x echo "Job end at $(date)" exit
问题分析
- 核心遗漏:脚本仅定义了可执行程序路径
EXEC=./calculos_jan.x,但未添加执行命令,导致任务直接跳过计算步骤结束。 - SLURM参数冲突:
--nodes=1、--tasks-per-node=20与--ntasks=1的组合矛盾。若使用单进程多线程(如OpenMP),应使用--cpus-per-task指定每个任务的CPU核心数,而非--tasks-per-node。 - 线程数配置不合理:若节点有20个核心,
OMP_NUM_THREADS=1仅使用1个核心,未充分利用资源。
修正后的脚本
场景1:单进程多线程(OpenMP)运行
调整SLURM参数以匹配OpenMP并行模式,并添加程序执行命令:
#!/bin/bash #SBATCH --job-name=calculos #SBATCH --partition=cempa #SBATCH --nodes=1 #SBATCH --ntasks=1 #SBATCH --cpus-per-task=20 # 每个任务使用20个核心 #SBATCH --time=10:00:00 #SBATCH --error=error_output_sbatch_%j.txt #SBATCH --output=output_sbatch_%j.txt # 分离输出和错误日志,便于排查 #SBATCH --exclusive echo "Job start at $(date)" module unload openmpi3 module load gnu8 # 显示分配的节点信息 echo $SLURM_JOB_NODELIST echo $SLURM_JOB_NUM_NODES # 配置OpenMP线程数,与cpus-per-task一致 export OMP_NUM_THREADS=20 EXEC=./calculos_jan.x # 执行Fortran程序 echo "Starting calculation..." $EXEC echo "Calculation finished" echo "Job end at $(date)" exit
场景2:多进程MPI运行
若你的Fortran程序是MPI并行版本,调整参数如下(需确保加载正确的MPI模块):
#!/bin/bash #SBATCH --job-name=calculos #SBATCH --partition=cempa #SBATCH --nodes=1 #SBATCH --tasks-per-node=20 # 每个节点启动20个MPI进程 #SBATCH --time=10:00:00 #SBATCH --error=error_output_sbatch_%j.txt #SBATCH --output=output_sbatch_%j.txt #SBATCH --exclusive echo "Job start at $(date)" module unload openmpi3 module load openmpi4 # 替换为你使用的MPI版本 module load gnu8 echo $SLURM_JOB_NODELIST echo $SLURM_JOB_NUM_NODES # 用mpirun启动MPI程序 EXEC=./calculos_jan.x echo "Starting MPI calculation..." mpirun -np $SLURM_NTASKS $EXEC echo "Calculation finished" echo "Job end at $(date)" exit
额外优化建议
- 分离输出和错误日志:原脚本将输出和错误写入同一文件,建议分开以便快速定位问题。
- 检查程序依赖:确保
./calculos_jan.x在脚本执行路径下,或使用绝对路径;确认加载的模块包含程序运行所需的Fortran运行库。 - 添加运行状态提示:在执行前后添加日志信息,便于判断程序是否启动。
内容的提问来源于stack exchange,提问作者Milena Dantas
相关产品推荐
相关产品推荐

