确定PBS脚本中qsub之后的总CPU数

Mas*_*rHD 3 mpi qsub pbs torque

对于使用qsub调用的PBS脚本,我想知道在PBS文件中定义的数字被命令行输入覆盖的情况下,实际分配了多少CPU.例如,使用以下pbs脚本文件:

jobscript.pbs:

#!/bin/bash
#PBS -N test_run
#PBS -l nodes=32
#PBS -l walltime=06:00:00
#PBS -j oe
#PBS -q normal
#PBS -o output.txt

cd $PBS_O_WORKDIR

module load gcc-openmpi-1.2.7
time mpiexec visct
Run Code Online (Sandbox Code Playgroud)

使用以下命令行可以使用16个CPU(而不是32个)运行此脚本:

$ qsub -l nodes=2:ppn=8 jobscript.pbs
Run Code Online (Sandbox Code Playgroud)

所以我想要一个强大的方法来确定脚本中实际可用的CPU数量.

Mas*_*rHD 5

我能够使用以下解决方案使用以下解决方案回答我自己的问题:$PBS_NODEFILE环境变量包含文件路径,列出有关可用节点的信息:

jobscript.pbs:

#!/bin/bash
#PBS -N test_run
#PBS -l nodes=32
#PBS -l walltime=06:00:00
#PBS -j oe
#PBS -q normal
#PBS -o output.txt

# This finds out the number of nodes we have
NP=$(wc -l $PBS_NODEFILE | awk '{print $1}')
echo "Total CPU count = $NP"
Run Code Online (Sandbox Code Playgroud)

多次在线搜索后感谢" Source ".


小智 5

MasterHD我知道你找到了答案,但我想我会分享另一种方式

此代码更长,但它有助于满足我的特定需求.我实际上使用pbsnodes命令.下面是我的代码片段.

@nodes_whole =`pbsnodes -av -s $server | grep "pcpus" `;
$nodes_count = ` pbsnodes -av -s $server | grep "pcpus" | wc -l `;
while($i < $nodes_count){
    @cpu_present = split(/\s+/, $nodes_whole[$i]);
    $cpu_whole_count += $cpu_present[3];
    $i++;
}
Run Code Online (Sandbox Code Playgroud)

我这样做是因为在我的脚本中我检查了cpus的数量,这取决于节点cpus可能是4,8,16.此外,我有多个集群,总是在改变大小,我不想要脚本具有硬编码的特定群集或节点信息.主要是,我这样做是因为当用户提交作业时,我会检查他们可以使用多少资源.如果说他们想要使用队列并请求200 cpus但是在群集A上他们的作业将排队,我的脚本可以告诉他们他们将排队但不会在群集b或d上.因此,他们可以选择在提交之前进行更改.

我还用它来检查节点:

@nodes_down=`pbsnodes -l -s $server `;
Run Code Online (Sandbox Code Playgroud)

我看到正在使用的资源:

@nodes_used=`pbsnodes -av -s $server | grep "resources_assigned.ncpus" `;
Run Code Online (Sandbox Code Playgroud)

另外在一种情况下,当我等待硬件时,我有两个簇在一个头节点上运行.在这种情况下,我检查节点分配给哪个群集,然后根据分配给该群集的节点进行计数.这样,所有用户都看到了另一个集群,并按照他们对任何其他集群的方式使用脚本.

我只是提到因为我找到了很多有用的方法来使用pbsnodes,它可以很好地满足我的特殊需求.