我想知道为什么 x264 中的无切片线程(http://akuvian.org/src/x264/sliceless_threads.txt)会导致延迟?例如,如果我有 2 个线程,则第一个线程编码一帧,第二个线程编码一帧。在某些情况下,秒必须等待第一个。但它们可以并行编码。
所以两个线程应该比一个线程快,对吧?
我想知道为什么 x264 中的无切片线程(http://akuvian.org/src/x264/sliceless_threads.txt)会导致延迟?例如,如果我有 2 个线程,则第一个线程编码一帧,第二个线程编码一帧。在某些情况下,秒必须等待第一个。但它们可以并行编码。
所以两个线程应该比一个线程快,对吧?
帧线程增加了帧的延迟而不是几秒钟,因为在开始获取输出帧(以填充管道)之前,您需要为编码器提供更多的输入帧。编码一帧本身将花费与使用一个线程几乎相同的处理器时间,但线程允许通过并行编码不同帧来进行流水线处理。另一方面,切片线程减少了延迟,因为所有线程并行编码一个帧,因此它比使用一个线程编码它完成得更快(切片线程也不需要帧中的延迟来进行流水线处理)。
我花了很长时间来推理它,但答案是排队论。
当前一帧的一半已被编码时,可以开始每一帧。但是,如果并行化要提供任何好处,那么大多数(最好是所有)线程都应该有一个可以工作的框架。5 个线程意味着 5 个帧。那就是管道。每当管道未完全填满时,并行化给您带来的好处就会减少。如果管道仅包含一帧,则只有一个线程在工作,因此您无法从并行化中获益。但是,如果您的管道通常是满的,那么它充满的是什么?未编码的帧。未编码的帧是必须被捕获的帧,因此它们代表了许多帧的延迟。
使用更多线程增加延迟的一个原因是连续帧相互使用以进行运动预测和补偿。这意味着为了压缩帧,您需要来自先前运动估计细节的信息。这意味着这些帧是相互依赖的,有时它们也必须至少等待来自其他线程的一些数据。这与当线程对帧进行切片时的切片线程形成对比,每个线程都在一个切片上工作,并且都在同一帧上工作,并且它们具有来自前一帧的所有所需信息,或者在 B 帧的情况下是下一个。