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

how to set number of task per node in slurm based on the parameter that I passed it to my program?

我想将每个节点的任务数设置为 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 脚本(杂音):

#!/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-per-node 设置为固定数量(如 8),它可以正常工作。但是我如何根据传递给程序的参数来设置它呢? 如果有任何帮助,我将不胜感激。

那是不可能的。一旦您的程序 运行ning,SLURM 已经必须固定每个节点的任务数。这是 运行 程序所必需的。

但是您可以扭转这一局面:在 SLURM 中设置每个节点的任务数并在您的程序中读取它。为此,SLURM 提供了许多环境变量。您可以阅读 SLURM_STEP_TASKS_PER_NODEgetenv。但是您需要考虑,这可能不是单个整数,而是因节点而异。如果所有节点都相同,则两个节点各有 8 个核心,它将具有 8(x2) 的形式。