SLURM作业数组中动态调整--cpus-per-task失效问题求助
问题分析与解决
你的脚本存在两个关键问题,导致所有作业都只使用1个CPU:
SLURM指令解析时机错误
#SBATCH指令是由sbatch命令在脚本执行之前就解析的,此时脚本里的export CPUS_PER_TASK=$SLURM_ARRAY_SUBMIT_ID语句还未运行,$CPUS_PER_TASK是空值,SLURM默认给每个任务分配1个CPU。变量使用错误
SLURM_ARRAY_SUBMIT_ID是整个数组作业的提交ID,所有数组任务的这个值完全相同;你需要的是每个任务的序号,应该用SLURM_ARRAY_TASK_ID(对应数组定义的1-3)。
修正后的脚本
以下是两种可行的修正方案:
方案1:用SLURM占位符直接指定CPU数
部分集群支持在 #SBATCH 指令中用 %a 占位符代表数组任务ID,直接设置每个任务的CPU数:
#!/bin/bash #SBATCH --job-name="Try_openmp" #SBATCH --time=00:10:00 #SBATCH --ntasks=1 #SBATCH --mem=8GB #SBATCH --output=/dev/null #SBATCH --array=1-3 # 用%a占位符直接绑定数组任务ID到CPU数 #SBATCH --cpus-per-task=%a cd $SLURM_SUBMIT_DIR # 设置OpenMP线程数与分配的CPU数一致 export OMP_NUM_THREADS=$SLURM_CPUS_PER_TASK srun ./main_vector.x >> openmp_results.txt
方案2:在脚本执行时动态指定CPU数
如果集群不支持 %a 占位符,可在脚本中通过 srun 参数动态指定:
#!/bin/bash #SBATCH --job-name="Try_openmp" #SBATCH --time=00:10:00 #SBATCH --ntasks=1 #SBATCH --mem=8GB #SBATCH --output=/dev/null #SBATCH --array=1-3 cd $SLURM_SUBMIT_DIR # 用数组任务ID设置CPU数和OpenMP线程数 export OMP_NUM_THREADS=$SLURM_ARRAY_TASK_ID srun --cpus-per-task=$SLURM_ARRAY_TASK_ID ./main_vector.x >> openmp_results.txt
额外注意事项
- 确保你的
main_vector.x编译时启用了OpenMP支持(例如GCC用-fopenmp参数),否则程序不会使用多线程。 - 如果输出文件
openmp_results.txt被多个任务同时写入,可能会出现内容混乱,建议为每个任务生成单独的输出文件(例如openmp_results_${SLURM_ARRAY_TASK_ID}.txt)。
内容的提问来源于stack exchange,提问作者Hjaleta
相关产品推荐
相关产品推荐

