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

SLURM作业数组中动态调整--cpus-per-task失效问题求助

问题分析与解决

你的脚本存在两个关键问题,导致所有作业都只使用1个CPU:

  1. SLURM指令解析时机错误
    #SBATCH 指令是由 sbatch 命令在脚本执行之前就解析的,此时脚本里的 export CPUS_PER_TASK=$SLURM_ARRAY_SUBMIT_ID 语句还未运行,$CPUS_PER_TASK 是空值,SLURM默认给每个任务分配1个CPU。

  2. 变量使用错误
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 12:32:42