Gnu Parallel:是否为每项工作并行重新加载程序?

Gnu Parallel: Does parallel reload program for every job?

假设我有一个程序在 运行 之前加载重要内容...但这是一次性的减速。

接下来,我写:

cat ... | parallel -j 8 --spreadstdin --block $sz ... ./mycode

这会导致每个作业的负载开销吗?

如果它确实会引起开销,是否有办法避免它?

parallel 对您 运行 程序的内部工作原理一无所知。每个实例 运行 都是独立的,无法将一个调用的初始化复制到其他实例。

如果您希望应用程序初始化一次,然后 运行 多个并行实例,您需要将其设计到应用程序本身中。它应该加载数据,然后使用 fork() 创建多个使用该数据的进程。

正如@Barmar 所说,./mycode 是为您的示例中的每个块启动的。

但是由于您在示例中没有使用 -k,您可以使用 --round-robin.

... | parallel -j 8 --spreadstdin --round-robin --block $sz ... ./mycode

这将启动 8 ./mycode 秒(但不是每个块一个)并为任何准备好读取的进程提供块。

这个例子表明,给进程 11 和 10 的块比进程 4 和 5 多,因为 4 和 5 读取速度较慢:

seq 1000000 |
  parallel -j8 --tag --roundrobin --pipe --block 1k 'pv -qL {}0000 | wc' ::: 11 4 5 6 9 8 7 10