如何根据我传递给程序的参数设置slurm中每个节点的任务数量?

时间:2016-03-30 12:41:53

标签: c mpi slurm

我想将每个节点的任务数设置为slurm中的变量,如:#SBATCH --ntasks-per-node = s * 2; (s是我将其作为参数传递给我的程序的每个节点的套接字数)。代码如下:  test.c文件的一部分:

if (argc < 3)
{
fprintf(stderr, "Usage: mpiexec program <#sockets>\n");
exit(1);
}
s = atoi(argv[1]);

bash script(slurm):

#!/bin/bash
#SBATCH --job-name=test
#SBATCH --time=00:30:00
#SBATCH --account=1234
#SBATCH --output=./test.out
#SBATCH --nodes=4
#SBATCH --mem-per-cpu=3900M
#SBATCH --ntasks-per-node=s*2     ???  
#SBATCH --exclusive

source /cluster/bin/jobsetup 
module load intel/2015.3
module load openmpi.intel/1.8.6

cd ~/filedir
mpirun --map-by ppr:2:socket --report-bindings ./test 4 > ./test

如果我为每个节点设置ntasks一个固定的数量,如8,它工作正常。但是我如何基于我传递给我的程序的参数来设置它? 我很感激你的帮助。

1 个答案:

答案 0 :(得分:2)

这是不可能的。程序运行后,SLURM必须修复每个节点的任务数。这是运行该程序所必需的。

然而,你可以改变这种情况:在SLURM中设置每个节点的任务数量并在程序中读取它。为此,SLURM提供了许多环境变量。您可以使用SLURM_STEP_TASKS_PER_NODE阅读getenv。但是你需要考虑,这可能不是一个整数,而是从节点到节点不同。如果所有节点都相同,则两个节点的形式为8(x2),每个节点有8个核心。