You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写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

问题分析

  1. 核心遗漏:脚本仅定义了可执行程序路径EXEC=./calculos_jan.x,但未添加执行命令,导致任务直接跳过计算步骤结束。
  2. SLURM参数冲突:--nodes=1、--tasks-per-node=20与--ntasks=1的组合矛盾。若使用单进程多线程(如OpenMP),应使用--cpus-per-task指定每个任务的CPU核心数,而非--tasks-per-node。
  3. 线程数配置不合理:若节点有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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 20:27:06