如何在SLURM数组的#SBATCH选项中使用变量指定范围?
SLURM数组范围动态设置的可行方法
你的原写法不可行,因为SLURM会在脚本的bash逻辑执行前,先解析所有#SBATCH指令,此时num变量还未被赋值,SLURM无法识别${num}这个变量引用。
下面是几种可行的动态设置SLURM数组范围的方法:
方法1:提交时通过sbatch命令行指定数组范围
直接在提交任务时用--array参数传递动态范围,无需在脚本里写固定的#SBATCH --array:
# 示例:传递num=1000来设置数组范围为1-1000%10 num=1000 sbatch --array=1-${num}%10 your_job_script.sh
如果需要从命令行接收num参数,可以写一个简单的提交脚本:
#!/bin/bash # 调用方式:./submit.sh 1000 num=$1 sbatch --array=1-${num}%10 your_job_script.sh
这里的your_job_script.sh只需要包含任务执行逻辑,不用再写#SBATCH --array指令。
方法2:用Here Document生成临时提交脚本
如果希望在同一个脚本里完成参数接收、数组配置和提交,可以生成临时的SLURM任务脚本:
#!/bin/bash # 调用方式:./dynamic_array.sh 1000 num=$1 # 生成临时任务脚本 cat << EOF > temp_slurm_job.sh #!/bin/bash #SBATCH --array=1-${num}%10 # 这里写你的任务逻辑 echo "Array task ID: \$SLURM_ARRAY_TASK_ID, total tasks: ${num}" EOF # 提交临时脚本并清理 sbatch temp_slurm_job.sh rm temp_slurm_job.sh
方法3:通过sbatch的--export传递变量(适合任务内需要用到num的场景)
如果不仅要设置数组范围,还要让任务脚本内部用到num变量,可以结合--export传递变量,同时在提交时指定数组:
#!/bin/bash num=$1 sbatch --array=1-${num}%10 --export=NUM=${num} your_job_script.sh
在your_job_script.sh里可以直接使用$NUM变量:
#!/bin/bash #SBATCH --job-name=dynamic_array echo "Task ID: \$SLURM_ARRAY_TASK_ID, total: \$NUM"
内容的提问来源于stack exchange,提问作者Emma Athan
相关产品推荐
相关产品推荐

