GNU parallel --jobs选项在群集上使用多个节点,每个节点有多个cpus

时间:2014-03-06 21:25:35

标签: hpc gnu-parallel

我正在使用gnu parallel在高性能(HPC)计算集群上启动代码,每个节点有2个CPU。该集群使用TORQUE便携式批处理系统(PBS)。我的问题是澄清GNU并行的--jobs选项如何在这种情况下工作。

当我在没有--jobs选项的情况下运行调用GNU parallel的PBS脚本时,如下所示:

#PBS -lnodes=2:ppn=2
...
parallel --env $PBS_O_WORKDIR --sshloginfile $PBS_NODEFILE \
  matlab -nodiplay -r "\"cd $PBS_O_WORKDIR,primes1({})\"" ::: 10 20 30 40

它看起来每个核心只使用一个CPU,并且还提供以下错误流:

bash: parallel: command not found
parallel: Warning: Could not figure out number of cpus on galles087 (). Using 1.
bash: parallel: command not found
parallel: Warning: Could not figure out number of cpus on galles108 (). Using 1.

这似乎是每个节点的一个错误。我不明白第一部分(bash: parallel: command not found),但第二部分告诉我它正在使用一个节点。

当我向并行调用添加选项-j2时,错误消失了,我认为它每个节点使用两个CPU。我仍然是HPC的新手,所以我检查这个的方法是从我的代码中输出日期时间戳(虚拟matlab代码需要10秒才能完成)。我的问题是:

  1. 我正确使用--jobs选项吗?指定-j2是否正确,因为每个节点有2个CPU?或者我应该使用-jN,其中N是CPU的总数(节点数乘以每个节点的CPU数)?
  2. 似乎GNU并行尝试确定每个节点上自己的CPU数量。有没有办法使我能正常工作?
  3. bash: parallel: command not found消息有什么意义吗?

2 个答案:

答案 0 :(得分:4)

  1. 是:-j是每个节点的作业数。
  2. 是:在远程主机上的$ PATH中安装'parallel'。
  3. 是:这是$ PATH中遗漏parallel的后果。
  4. GNU Parallel登录到远程机器;尝试确定失败的核心数(使用parallel --number-of-cores),然后默认为每个主机1个CPU核心。通过赋予-j2 GNU Parallel将不会尝试确定核心数量。

    您是否知道也可以将--sshlogin中的核心数量指定为:4 / myserver?如果混合使用具有不同内核数量的计算机,这将非常有用。

答案 1 :(得分:0)

这不是3个主要问题的答案,但我想在第一个代码块中指出并行语句的其他一些问题。

parallel --workdir $PBS_O_WORKDIR --sshloginfile $PBS_NODEFILE \
  matlab -nodisplay -r "primes1({})" :::: 10 20 30 40

shell在执行parallel之前扩展了$ PBS_O_WORKDIR。这意味着发生了两件事情:(1) - env看到文件名而不是环境变量名,基本上什么都不做,(2)扩展为部分命令字符串,无需传递$ PBS_O_WORKDIR,这就是为什么没有这样做的原因错误。

最新版本的parallel 20151022有一个workdir选项(尽管教程将其列为alpha测试),这可能是最简单的解决方案。并行命令行看起来像:

interface IArithmeticOperation<T> 
{
    void Shift(T[] left, object value);
    void Scale(T[] left, object value);
}

private void MyFunction<T>(T[] data) 
{   
    var ops = GetOperations<T>();
    ops.Scale(data, 5);
}


IArithmeticOperations<T> GetOperations<T>()
{ 
    object result;

    switch(Type.GetTypeCode(typeof(T))
    {
       case TypeCode.Double:
         result = new DoubleArithmeticOperations();  
         break;
       case TypeCode.Int16:
         result = new Int16ArithmeticOperations();  
         break;

       defaut:            
           throw new InvalidOperationException("Unsupported type");
    }

    return (IArithmeticOperation<T>) result;
}

最后请注意,如果qsub请求多个处理器,则PBS_NODEFILE可能包含多次列出的主机。这很多都会对就业人数等产生影响。