我想知道为什么x264中的无切片线程(http://akuvian.org/src/x264/sliceless_threads.txt)会导致延迟?例如,如果我有两个线程,第一个线程编码一个帧,第二个线程编码一个帧。在某些情况下,秒数必须等待第一个。但它们可以并行编码。
所以两个线程应该比只有一个快,对吧?
发布于 2012-07-24 19:43:10
帧线程增加了延迟(以帧为单位),而不是以秒为单位,因为在开始获取输出帧(填充管道)之前,您需要向编码器提供更多输入帧。编码一个帧本身将占用与使用一个线程几乎相同的处理器时间,但是线程允许通过编码不同的帧并行来进行流水线处理。另一方面,切片线程减少了延迟,因为所有线程都对进行一帧并行的编码,所以它比用一个线程编码的速度更快(此外,切片线程不需要在帧中进行管道处理的延迟)。
发布于 2012-07-23 04:02:26
我花了很长时间才想通它,但答案是排队理论。
当前一帧的一半已经被编码时,可以开始每一帧。但是,如果并行化要提供任何好处,那么大多数(最好是所有)线程都应该有一个框架来工作。5个线程意味着5个帧。这就是管道。任何时候流水线还没有完全满的时候,并行化给你带来的好处就少了。如果管道只包含一个帧,则只有一个线程在工作,因此您无法从并行化中获得任何好处。但是,如果您的管道通常是满的,那么它充满了什么呢?未编码的帧。未编码的帧是必须已捕获的帧,因此它们代表相当于延迟的许多帧。由于流水线中的一些帧是部分编码的,所以延时可能会稍微小一些,因为流水线中的一些帧是部分编码的,但一般而言,流水线中的每个项目都会造成延时。
发布于 2019-10-08 21:35:39
增加更多线程的延迟的一个原因是,连续的帧相互使用对方进行运动预测和补偿。这意味着为了压缩一帧,你需要从先前的运动估计细节中获得信息。这意味着这些框架是相互依赖的,有时它们还必须等待至少一些来自其他线程的数据。这与切片线程不同,当线程对帧进行切片时,每个线程都在一个切片上工作,并且都在同一帧上工作,并且它们拥有来自前一帧的所有所需信息,或者在B帧的情况下下一帧。
https://stackoverflow.com/questions/11599967
复制相似问题