如何加速libjpeg解压缩

4
我们在小型嵌入式平台上使用libjpeg进行JPEG解码。当我们解码大图像时,我们遇到速度问题。例如,一个大小为20 MB,尺寸为5000x3000像素的图像需要10秒才能加载。
我需要一些关于如何提高解码速度的提示。在另一个性能类似的平台上,我可以在两秒钟内加载相同的图像。
最好的改进是从14秒降至10秒,通过使用更大的读取缓冲区(64 kB而不是默认的4 kB)实现的。但是其他任何措施都没有帮助。
我们不需要以完整分辨率显示图像,因此我们使用scale_num和scale_denom将其显示为较小的尺寸。但我想要更好的性能。是否可能使用某种形式的多线程等?不同的解码设置?我已经没有更多的想法了。

3
对于一个好的回答来说,对目标硬件和操作环境过于保密可能不利。处理器架构、操作系统、内存大小、内存带宽等信息都可能与问题相关。您从哪里加载图像?您确定这不是瓶颈吗?例如SD卡的性能差异很大,特别是在SPI读取方面。 - Clifford
2
目标图像尺寸是多少?如果您愿意获得1/8 x 1/8缩放的图像(625x325),则可以通过仅解码DC值来获得巨大的速度提升(无需反向变换)。 - BitBank
3个回答

4
首先-对代码进行分析。如果您不能确定性地确定瓶颈,那么您只能留下很少的猜测。
接下来,搜索libjpeg文档以获取加速机会。您提到了scale_num和scale_denom。解压缩器的dct_method呢?我发现DCT_FASTEST选项是不错的选择。还有其他选项要检查:do_fancy_upsampling,do_block_smoothing,dither_mode,two_pass_quantize等等。这些中的一些或全部可能对您有用,具体取决于您的系统,libjpeg版本等。
如果没有可用的分析工具,仍然有一些尝试方法。首先,我怀疑您的瓶颈与CPU无关。要确认,请将未压缩的图像加载到RAM缓冲区中,然后像以前一样从那里解压缩它。这是否显着提高了解压缩时间?如果是,罪魁祸首似乎是从图像存储介质读取操作。根据您的系统,从USB(或SD等)读取可能很慢。(请注意,我假设是从外部媒体读取 - 尽管硬件详细信息很少。)确保优化相关总线参数,例如SPI时钟,配置等。
如果您正在从类似内部闪存(即NAND)之类的东西中读取,则有一些其他要检查的内容。您的NAND控制器如何配置?您是否确保控制器配置为最快操作?检查等待状态,时间等。请注意,总线和/或内存争用也可能是问题,因此也要检查它们的相应配置。
最后,如果您认为您的系统实际上是受CPU限制的,则此stackoverflow问题可能会引起兴趣:Can a high-performance jpeglib-turbo implmentation decompress/compress in <100ms?

2
多线程只有在目标设备具有多个执行单元以进行真正的并发执行时,才能帮助解码过程。否则,它只是对现有CPU资源进行时间片分配。除非库被设计用于利用多线程,否则任何情况下都不会有帮助。
如果您从源代码构建库,则首先应确保已打开优化,并仔细选择编译器选项以匹配构建目标及其指令集,以使编译器可以使用SIMD或FPU等功能。
您还需要考虑其他可能的瓶颈。这10秒钟只是解码所需时间,还是包括从文件系统或网络读取所需时间?鉴于增加读取缓冲区大小时观察到的改进,很可能是数据读取而不是解码在这种情况下受限制。
如果实际上文件系统访问是限制因素而不是解码,则通过单独的线程将文件读取与解码分离,并通过管道、队列或多个共享内存缓冲区传递数据给解码器,可能会有一些好处。然后,您可以确保解码器可以流式解码,无需等待文件系统阻塞。

嗨 Clifford,当我将读取缓冲区增加到64kB时,它的效果更好,但是当我尝试将其增加到256 kB时,变化很小。 - Bogi
1
@Bogi:你在问题中已经提到了这一点;这并没有证明我的假设是错误的,只是文件系统可能已经以最快的速度运行了。我建议你尝试每次读取整个文件的64kb,不要解码或显示来查看需要多长时间。如果这已经太长了,你可能需要先解决这个问题,然后再去责怪JPEG解码器,或者它可能是一个限制因素,不能轻易解决,直到你进行了分析,看看时间都花在哪里,才能回答这个问题。 - Clifford
@bogi:与我的建议相反,有一种多线程可以帮助的方法;我已经编辑了我的答案。 - Clifford

2

看看libjpeg-turbo。如果您有支持的硬件,则通常比相同CPU上的libjpeg快2-4倍。典型的12MB jpeg在Pandaboard上解码不到2秒钟。您还可以在此处查看各种JPEG解码器的速度分析here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接