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
假设我有一个程序在 运行 之前加载重要内容...但这是一次性的减速。
接下来,我写:
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