【问题标题】:How to speed up libjpeg decompression如何加快libjpeg解压
【发布时间】:2014-03-26 16:36:15
【问题描述】:

我们在我们的小型嵌入式平台上使用 libjpeg 进行 JPEG 解码。当我们解码大图像时,我们遇到了速度问题。例如,大小为 20 MB 且尺寸为 5000x3000 像素的图像需要 10 秒才能加载。

我需要一些关于如何提高解码速度的提示。在其他性能相似的平台上,我在两秒钟内就可以加载相同的图像。

通过使用更大的读取缓冲区(64 kB 而不是默认的 4 kB),我们获得了从 14 秒到 10 秒的最佳减少。但没有其他帮助。

我们不需要以全分辨率显示图像,因此我们使用 scale_num 和 scale_denom 以较小的尺寸显示它。但我想有更多的表现。是否可以使用某种多线程等?不同的解码设置?任何事情,我都有想法。

【问题讨论】:

  • 对目标硬件和操作环境如此谨慎可能不利于一个好的答案。处理器架构、操作系统、内存大小、内存带宽等信息可能都密切相关。你从什么加载图像?你确定这不是瓶颈吗?例如,SD 卡的性能差异很大,尤其是通过 SPI 读取。
  • 目标图片尺寸是多少?如果您愿意获得 1/8 x 1/8 的缩放图像 (625x325),您只需解码 DC 值即可获得巨大的速度提升(无需逆变换)。

标签: performance embedded jpeg libjpeg decoder


【解决方案1】:

如果目标具有多个执行单元以实现真正的并发执行,多线程只能帮助解码过程。否则,它只会对现有 CPU 资源进行时间切片。在任何情况下它都无济于事,除非图书馆是为了使用它而设计的。

如果您从源代码构建库,您首先应确保在打开优化的情况下构建它,并仔细选择编译器选项以使构建与您的目标及其指令集相匹配,以使编译器能够使用 SIMD 或以 FPU 为例。

您还需要考虑其他可能的瓶颈。 10 秒只是解码时间,还是包括从文件系统或网络读取的时间?鉴于在增加读取缓冲区大小时观察到的改进,在这种情况下,很可能是数据读取而不是解码受到限制。

如果实际上文件系统访问限制因素而不是解码,那么在单独的线程中将文件读取与解码分离并通过管道传递数据可能会有一些好处或队列或多个共享内存缓冲区到解码器。然后,您可以确保解码器可以流式传输解码,而无需等待文件系统阻塞。

【讨论】:

  • 嗨 Clifford,当我将阅读缓冲区增加到 64kB 时效果更好,但是当我尝试将其增加到 256kB 时,它几乎没有变化。
  • @Bogi:您在问题中已经说过了;它并没有反驳我的假设,只是文件系统可能运行得尽可能快。我建议您测试一次读取整个文件 64kb,解码或显示以查看需要多长时间。如果这已经太长了,您可能需要在指责 JPEG 解码之前解决这个问题,或者它可能是一个限制因素并且无法轻易解决,或者直到您对其进行分析以查看时间消耗在哪里之前很难回答.
  • @bogi :与我的建议相反,多线程可以提供帮助;我已经编辑了我的答案。
【解决方案2】:

首先 - 分析代码。如果您无法明确确定瓶颈,那么您只能进行猜测。

接下来,搜索有关 libjpeg 加速机会的文档。你提到了scale_numscale_denom。解压器的dct_method呢?我发现DCT_FASTEST 选项很好。还有其他选项需要检查:do_fancy_upsamplingdo_block_smoothingdither_modetwo_pass_quantize 等。其中一些可能对您有用,具体取决于您的系统、libjpeg 版本等。

如果分析工具不可用,仍有一些事情可以尝试。首先,我怀疑您的瓶颈与 CPU 无关。为了确认,将未压缩的图像加载到 RAM 缓冲区中,然后像以前一样从那里解压缩。这是否显着改善了减压时间?如果是这样,罪魁祸首似乎是从图像存储介质中读取操作。根据您的系统,从 USB(或 SD 等)读取可能会很慢。 (请注意,我假设从外部媒体读取 - 尽管硬件细节很少。)请务必优化相关总线参数(SPI 时钟、配置等)。

如果您正在从内部闪存(即 NAND)之类的东西中读取数据,则还有一些其他的东西需要检查。您的 NAND 控制器是如何配置的?您是否确保为最快的操作配置了控制器?检查等待状态、时间等。请注意,总线和/或内存争用也可能是一个问题 - 因此也要检查它们各自的配置。

最后,如果您认为您的系统实际上是 CPU 密集型的,那么这个 stackoverflow 问题可能会引起您的兴趣: Can a high-performance jpeglib-turbo implmentation decompress/compress in <100ms?

【讨论】:

    【解决方案3】:

    看看 libjpeg-turbo。如果您有支持的硬件,那么它通常比同一 CPU 上的 libjpeg 快 2-4 倍。在 Pandaboard 上,典型的 12MB jpeg 在不到 2 秒的时间内被解码。你也可以看看各种JPEG解码器的速度分析here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      • 2011-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-11
      相关资源
      最近更新 更多