【问题标题】:x264 threading latencyx264 线程延迟
【发布时间】:2019-10-08 21:35:39
【问题描述】:

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

所以两个线程应该比一个线程快,对吧?

【问题讨论】:

  • 我怀疑无切片线程是为了减少延迟而设计的。多线程增加延迟但也增加吞吐量并不少见。您如何测量延迟?
  • 我没有测量延迟时间。一位 X264 开发人员说:x264dev.multimedia.cx/archives/249

标签: latency x264


【解决方案1】:

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

【讨论】:

  • 非常感谢!总之:无切片或基于帧的线程会导致延迟,因为必须填充整个管道。例如,对于 5 个线程,如果所有 5 个线程都有一个线程,则编码过程开始。正确的?分片线程减少了延迟,因为帧被分割成片。然后对切片进行并行编码。如果第一帧完成,第二帧将被编码。对吗?
【解决方案2】:

我花了很长时间来推理,但答案是排队论。

当前一帧的一半被编码后,每一帧都可以开始。但是,如果并行化要提供任何好处,那么大多数(最好是所有)线程都应该有一个框架来处理。 5 个线程意味着 5 个帧。那就是管道。每当管道未完全填满时,并行化给您带来的好处就会减少。如果管道仅包含一帧,则只有一个线程在工作,因此您无法从并行化中获益。但是,如果您的管道通常是满的,那么它充满的是什么?未编码的帧。未编码的帧是必须被捕获的帧,因此它们代表了许多帧的延迟。由于流水线中的某些帧是部分编码的,但通常流水线中的每个项目都会导致延迟,因此延迟可能会稍微减少帧的一小部分恒定部分。

【讨论】:

    【解决方案3】:

    使用更多线程会增加延迟的一个原因是连续帧相互使用以进行运动预测和补偿。这意味着为了压缩帧,您需要来自先前运动估计详细信息的信息。这意味着这些帧是相互依赖的,有时它们也必须至少等待来自其他线程的一些数据。这与分片线程形成对比,当线程对帧进行切片时,每个线程都在一个切片上工作,并且都在同一帧上工作,并且它们具有来自前一帧的所有所需信息,或者在 B 帧的情况下是下一个。

    【讨论】:

      猜你喜欢
      • 2011-10-18
      • 2013-08-31
      • 2013-12-01
      • 2011-07-28
      • 2017-10-05
      • 1970-01-01
      • 1970-01-01
      • 2011-11-17
      • 1970-01-01
      相关资源
      最近更新 更多