8

我正在通过GNU Parallel totorial工作。在“多个参数”部分中,有以下示例(注意:num30000 是一个文本文件,其连续行上的数字为 1 到 30,000):

为了更好的并行性,当文件结束时,GNU Parallel 可以在所有并行作业之间分配参数。

并行运行 4 个作业会将最后一行参数拆分为 4 个作业,总共有 5 个作业:

  cat num30000 | parallel --jobs 4 -m echo | wc -l

输出:

  5

我的问题是:为什么我们期望总共有 5 个工作?我显然错过了一点,虽然我不知道这是否重要。我预计有 4 个工作,因为 30,000 可以被 4 整除。我决定在运行以下命令后发布这个问题:

cat num30000 | parallel --jobs 4 -m echo | colrm 12

这导致:

1 2 3 4 5 6
23696 23697
25273 25274
26850 26851
28427 28428

这在我看来就像第一个echo命令传递了前 23,695 个参数。然后,其余的被分成 4 个作业,参数计数为 1577、1577、1577 和 1574。我是否误解了并行调用应该做什么?谢谢!

4

2 回答 2

6

您为这个答案付出的代价是帮助我以某种方式改进示例,以便您在第一次阅读时就可以理解它。

所以会发生以下情况:

GNU Parallel 计算出限制是 131071。然后它会查看当前正在运行的作业数 (0)。这是否小于并行运行的作业数 (4):然后它读取参数达到 131071 限制并启动该作业。这是第一份工作。

现在 GNU Parallel 再次读取参数。这次它读取所有其余部分并到达文件末尾。“哦,”GNU Parallel 想。“如果这是文件的结尾,那么我会将所有参数分散到所有工作槽 (4)。” 因此,它采用了所有其余的论点并将它们分散到 4 个工作中。然后它启动 3 个作业。现在有 4 个作业正在运行。

一个正在运行的作业完成,提供一个空闲的作业槽;所以 GNU Parallel 开始了最后的工作。

如果您有 4 个内核和 100 个参数,那么这种设计的原因就更清楚了:100 个参数很容易放在一行上,但是通常在 4 核机器上运行 4 个 25 个参数的作业比运行 1 个 100 个参数的作业要快参数。

于 2014-01-12T04:25:36.690 回答
3

我现在理解语言了。该-m参数要求并行将尽可能多的参数放在命令行上。我的 131071 个字符的限制意味着总共echo生成了两个命令。第一个最多有 23695 号。第二个有其余的。该--jobs 4参数仅影响第二个命令。这就是本教程所说的“最后一行论点”的意思。所以,我明白为什么总共有 5 个工作。但是,我不明白为什么--jobs只影响最后一行论点,但这不是我问的问题。

于 2014-01-10T20:26:46.270 回答