【发布时间】:2019-01-28 03:12:13
【问题描述】:
我必须运行视频编码程序,其中我有不同的量化参数 QP。 QP 从 0 到 51。在我的 perl 脚本中,我遍历这个参数并执行命令行。命令行是 qiven:
TAppEncoder encoder_intra_main_rext.cfg -i BSEQ.RAW -b BSEQ_1.bin -o /dev/null -qp 1 -wdt 7811 -hgt 7911 -fr 1 -fs 0 -f 2 --InputBitDepth=16 --OutputBitDepth= 16 --InternalBitDepth=16 --InputChromaFormat=400 --ConformanceMode=1 --SEIDecodedPictureHash >> BSEQ_1.txt
在每次迭代中,我只更改 qp。现在,在我的 Perl 脚本中,当我执行上面的行时,它会等待完成,然后继续循环中的下一个迭代(例如 qp=2)。
顶层shell脚本也调用了perl脚本:
test.sh ---> test.pl ---> command1 with qp=1
---> command2 with qp=2
---> command3 with qp=3
---> command4 with qp=4
---> until the end of the for loop
我想知道如何并行运行两个(或更多)进程。例如,运行qp=1 并紧跟在qp=2 之后,无需等待qp=1 完成。而当这两个中的一个完成时(无论是 qp=1 还是 qp=2 先完成)运行 qp=3,依此类推。
所以基本上,我不想并行运行 perl 脚本,也不需要 perl 脚本的多个实例。我需要脚本中的命令(这是循环的一部分)并行运行。但是,如果有其他方法可以实现这一点,请告诉我。
部分代码如下,现在它一次运行一个qp。我想一直并行运行 2,一旦完成就转到下一个,所以一直有 2 个进程在运行。
我在 linux mint 上运行脚本。我在一台计算机上运行它(我没有集群)。这个想法是在两个核心上调整它。
知道如何做到这一点,或者至少从哪里开始? 谢谢。
$QP_end = $Configuration->{nb_QPs}-1;
foreach $QP_index (0 .. $QP_end)
{
$QP = $Configuration->{QP_list}[$QP_index];
print($QP," ");
set_command_line(); # HERE I CHANGE THE QP TO SET NEW COMMAND LINE, AND THEN EXECUTE THE NEW COMMAND
@RunCommand = ($command_line);
`@RunCommand`;
}
【问题讨论】:
-
你为什么要使用 Perl?该任务在 shell 脚本中将是微不足道的。此外,您是否要求按特定顺序收集输出,或者并行任务是否可以按照它们碰巧完成的顺序写入输出文件?
-
顺序无关紧要。我使用 perl 是因为我继承了以前从事此工作的人的代码。脚本本身有大约 1300 行(我们必须在其中设置和检查多种配置),并且为我(这里是新手)在 shell 中重写它会花费很多时间。
-
@tripleee 但是我使用顶级 bash 脚本 ( test.sh ) 运行 perl 脚本 从 test.sh 我运行 perl 脚本(仅一次,没有 for 循环)运行我之前提到的命令。这对你来说意味着什么吗?可以在 shell 脚本中并行化吗?
标签: perl for-loop parallel-processing