GNU Parallel:嵌套并行

11

能否在由gnu parallel出发的多个脚本中调用gnu parallel?

我有一个运行100多个顺序迭代的Python脚本,在每个迭代的某个地方,使用gnu parallel并行计算4个值。现在我想再次使用gnu parallel同时生成多个这样的脚本。这个可行吗? Gnu parallel会利用可用的核心吗?

例如,在内部循环中,如果已经完成了4个值中的2个并且还有2个正在运行,那么单个脚本无法进行下一个迭代直到所有4个值都被计算完。是否会自动使用两个空闲核心来计算不同运行的脚本的结果? 我该如何指定可用的总核心数? 在内部或外部调用parallel时?

问题显示可以嵌套调用parallel,但是我不确定当我从脚本内部调用嵌套parallel时是否会改变。

PS:Thrashing不是问题,我可以从大型集群使用很多核心。

PS2:gnu-parallel是一款非常棒的工具...谢谢! :)

1个回答

14

是的。GNU Parallel被设计(并经过大量测试)可以直接从GNU Parallel或脚本中调用。

如果直接调用,您可能需要更改-I。这里第二个{}是什么意思(它是指第一个还是第二个并行操作?):

seq 10 | parallel 'seq {} | parallel echo {}'

这里非常清晰明了:

seq 10 | parallel 'seq {} | parallel -I // echo //'
seq 10 | parallel 'seq {} | parallel -I // echo {} //'

很高兴听到您觉得GNU Parallel很棒。如果您喜欢GNU Parallel:

  • 请浏览教程(http://www.gnu.org/software/parallel/parallel_tutorial.html)。
  • 在您所在的当地用户组/团队/同事中进行演示
  • 在Reddit/Diaspora*/论坛/博客/Identi.ca/Google+/Twitter/Facebook/Linkedin/邮件列表上发布介绍视频和教程
  • 为您最喜欢的博客或杂志请求或编写评论
  • 邀请我参加您的下一次会议

如果您将GNU Parallel用于研究:

  • 请在您的出版物中引用GNU Parallel(使用--bibtex)

如果GNU Parallel让您省钱:


是否有文档支持GNU parallel通过嵌套并行处理的步骤顺序和资源消耗?我担心一些读者可能会看到这个并尝试多次嵌套并行调用,而没有真正思考整个过程。 - Jon
GNU Parallel通常会占用16 MB的RAM。仅有以下情况会改变它:多个输入源强制生成所有组合(例如parallel echo :::: file1 file2)- 所有组合将在RAM中。使用--bar/--etatotal_jobs(),这将在内存中生成所有args(大约每个作业400字节)。--linebuffer将每个作业读取一整行 - 因此非常长的行(比如1 GB)将增加RAM使用量。--sql*将在作业完成时在内存中缓冲单个作业的输出。但也许这应该写进man parallel_design中? - Ole Tange
1
个人而言,我不会这样做。相反,我会定义一个 shell 函数并调用它。我认为这样更易于阅读和维护。 - Ole Tange
@marc.guenther 这就是目标,没错。 - Ole Tange
抱歉,我指的是你的答案,而不是上面的讨论。 "GNU Parallel被设计(并经过大量测试)可以从GNU Parallel中直接调用或通过脚本调用。" 显然事实并非如此。正如我所写的那样,内部并行调用不知道外部调用甚至彼此之间的任何信息,因此会完全破坏CPU。 - marc.guenther
显示剩余6条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接