将选项指定--jobs给 GNU 时parallel,它究竟是什么意思?
我执行:
parallel --jobs 10 ./program ::: {1..100}
Run Code Online (Sandbox Code Playgroud)
哪里program是一个密集的任务,而且这些工作是完全相互独立的。{1..100}代表每个任务的符号输入。当我检查 PC 上运行的进程时,我发现很多时候同时运行的作业少于10 个。
那么具体是指什么--jobs呢?
根据手册页,--jobs每台机器上并行运行的最大作业数(重点是我的):
——职位N
每台机器上的作业槽数。并行运行最多N 个作业。0 表示尽可能多。
这并不意味着它总是等于那个。并行计算的首要要求是作业可以独立运行,并且最终的输出可以组合起来,这样如果作业顺序运行,就会产生相同的输出。如果不可能,则任务无法并行完成。
另外,来自 GNU 并行手册页:
GNU并行是一种shell工具,用于使用一台或多台计算机并行执行作业。作业可以是单个命令或必须针对输入中的每一行运行的小脚本。
现在,如果文件只有 2 行,但您传递--jobs 10,则parallel无法为 2 行运行 10 个作业,因为它需要的最小输入是一行。因此,您只会看到 2 个职位。
这不仅是 GNU 并行的情况,几乎是所有并行计算引擎的情况。