8

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

当我在没有 --jobs 选项的情况下运行调用 GNU 并行的 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 的新手,所以我检查这一点的方法是从我的代码中输出日期时间戳(虚拟 m​​atlab 代码需要 10 秒才能完成)。我的问题是:

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

2 回答 2

4
  1. 是:-j 是每个节点的作业数。
  2. 是:在远程主机上的 $PATH 中安装“并行”。
  3. 是的:这是parallel从 $PATH 中丢失的结果。

GNU Parallel 登录到远程机器;尝试确定parallel --number-of-cores失败的核心数(使用 ),然后默认为每个主机 1 个 CPU 核心。通过给-j2GNU Parallel 将不会尝试确定内核的数量。

您是否知道您还可以将 --sshlogin 中的核心数指定为: 4/myserver ?如果您混合了具有不同内核数量的机器,这将很有用。

于 2014-03-07T09:32:39.540 回答
0

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

parallel --env $PBS_O_WORKDIR --sshloginfile $PBS_NODEFILE \
  matlab -nodiplay -r "\"cd $PBS_O_WORKDIR,primes1({})\"" ::: 10 20 30 40

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

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

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

最后一点,如果 qsub 请求多个处理器,则 PBS_NODEFILE 可能包含多次列出的主机。这对运行的作业数量等有影响。

于 2015-11-06T17:36:39.273 回答