从PBS作业脚本运行某个程序时,是否有任何方法可以确定该程序有多少个线程可用?
在PBS工作脚本的标题中,我设置了
#PBS -l nodes=1:ppn=8
我是否可以使用一条命令来检测线程数-这样我就可以将一个变量设置为等于该数字(用于下游进程)。
这样,我可以为下游进程将线程设置为
$k
,而不是每次更改#PBS -l nodes=1:ppn=_
时都逐行执行代码。谢谢大家!
我找到了解决方法-
因此,如果使用单个节点,我要查找的变量是$ PBS_NUM_PPN
最佳答案
默认情况下,PBS在运行的作业中不公开ppn
设置。而且,shell脚本无法在不知道和解析其源代码的情况下读取其注释(由于多种原因,这在这里可能无法正常工作)。
但是这里有一些想法:
您可以使用qsub
选项从-v
命令行传递任意变量。 (您也许可以使用#PBS -v ...
做同样的事情,但等同于以常规方式在脚本中设置变量。)
您应该能够在-l
命令行而不是在作业脚本中指定资源(使用qsub
)。
像这样将它们放在一起:
qsub ... -l nodes=1:ppn=8 - v NOSTHREADS=8 myscript.pbs
其中
myscript.pbs
是:#!/bin/bash
#PBS directives ... without the "-l" !!!
# ordinary shell commands.
somecommand --someoption $NOSTHREADS ...
注意:建议您不要在命令行和脚本中混用指定资源。仅将“ -l”选项放在一个位置。如果将它们放在两个地方,并且您的Torque / PBS安装使用作业提交过滤器,则事情可能会变得很混乱。
另外,您可以编写一个shell(或python或其他)启动程序,该启动程序生成PBS脚本,并带有匹配的
ppn
(等)资源值和嵌入在生成的脚本中的相应变量。如果您还做其他一些事情,则这种方法的优点是可重复性更高。 (向当地的eResearch分析人员咨询有关科学计算中可重复性的信息。)
如果以上两种方法均无法起作用,则可以检查作业脚本中的
ulimit
设置。但是,我的理解是PBS mon
通常不会使用ulimit限制作为执行线程/进程限制的方法。相反,它将监视活动核心的数量。 (ppn
资源限制了处理器的数量,而不是线程或进程的数量。)