2012-07-22 115 views
3

我想知道为什么x264中的无界线程(http://akuvian.org/src/x264/sliceless_threads.txt)导致延迟?如果我有例如2个线程,第一个编码一个帧,第二个编码一个帧。在某些情况下秒必须等待第一秒。但它们可以并行编码。x264线程延迟

所以两个线程应该比只有一个更快,对吗?

+0

我怀疑无切片线程的设计是为了减少延迟。多线程增加延迟并且增加吞吐量并不罕见。你如何衡量延迟? – 2012-07-22 12:04:48

+0

我还没有测量延迟。 X264开发者之一表示:http://x264dev.multimedia.cx/archives/249 – TheRock 2012-07-22 16:59:22

回答

2

我花了相当长的一段时间来理解它,但答案是排队论。

每个帧都可以在前一帧的一半被编码时启动。但是,如果并行化将提供任何好处(最好是所有)线程应该有一个框架来工作。 5个线程表示5个帧。这是管道。任何时候管道没有完全满,并行化给你带来的好处更少。如果管道仅包含一个帧,则只有一个线程正在工作,因此您不会从并行中获益。但是如果你的管道通常已经满了,那它到底是什么东西?未编码的帧。未编码的帧是必须被捕获的帧,因此它们表示许多帧的延迟。延迟可能稍小于帧的一小部分,因为流水线中的一些帧被部分编码,但通常流水线中的每个项目都会造成延迟。

2

由于在开始获取输出帧(填充管道)之前需要为编码器输入更多的帧,帧线程会在帧中延迟时间而不是秒。编码一个帧本身将花费与一个线程几乎相同的处理器时间,但是线程允许通过编码不同的帧并行来允许流水线处理。另一方面,由于所有线程都将并行编码为,因此它将比使用一个线程对其进行编码的速度更快(同时切片线程不需要用于管道的帧延迟),从而减少了延迟。

+0

非常感谢!总之:无切片或基于框架的线程导致延迟,因为整个管线必须被填充。例如对于5个线程,如果所有5个线程都有一个线程,则编码过程开始。正确? 切片线程减少延迟,因为帧被分割成片。然后切片被并行编码。如果第一帧完成,则第二帧将被编码。正确? – TheRock 2012-07-25 09:31:48