【问题标题】:How to perform jpeg encoding of a BIG RGB-image in parallel?如何并行执行 BIG RGB 图像的 jpeg 编码?
【发布时间】:2020-09-03 02:52:35
【问题描述】:

我必须使用 jpeg 压缩一个非常大的图像(图像大小> 100 MB)。

我现在使用 openCV 3.4.3 进行编码(openCV 使用 libjpeg-turbo 1.5),我需要 750 [ms] 获取 129 MB RGB 图像(7250 * 621 * 3),但它使用单线程。

我想使用线程加速 jpeg 编码(和解码)

怎么做?

我使用的是 Windows 机器,

如果有帮助,我可以使用 IPP(英特尔的)。

【问题讨论】:

  • 您可以尝试libvips libvips.github.io/libvips/API/current/using-from-cpp.html 或者您可以将您的应用程序线程化到不同的维度,即,而不是由多个线程一次处理一个图像,每个线程处理同一图像的不同部分,而是一次处理多个图像,每个图像由一个线程处理。
  • 您这样做的吞吐量目标是多少(基准性能节奏 - 每秒图片数)?
  • @user3666197,我只有一张大图。目标是以尽可能短的延迟完成任务。我的用户正在等待他的输出
  • 一些 ImageMagick 例程是多线程的,但我不知道是否转换为 JPEG。可能值得一试。
  • 根据文件的内容,它可能会在磁盘上创建一个相当大的文件——比如 70MB——所以如果你的电脑有只能做 150MB/s 的传统旋转磁盘,你可以有 500ms 的 I/ O。也许尝试在 RAMdisk 上写入 - 就像 DataRam 的那样,看看是否有帮助。

标签: c++ parallel-processing jpeg image-compression


【解决方案1】:

Q“如何并行执行 BIG RGB 图像的 jpeg 编码?”

@user3666197,我只有一张大图。目标是以尽可能短的延迟完成任务。我的用户正在等待他的输出——Ido 5 小时前

从 RGB 数组生成的 JPEG 编码可以在几个主要步骤中为 performed

1) 颜色变换:将 RGB 转换为 YCbCr - 易于并行化,无块/内核依赖
2 ) JPEG 颜色/亮度下采样 - 易于并行化,无块/内核依赖
3 ) 8 x 8 块上的 DCT - 2D 离散余弦变换 - 在 (8 x 8 ) 数据块上易于并行
4 ) 去零和霍夫曼编码 - AFAIK 这必须是纯的 -[SERIAL] 流处理

如果有兴趣设计一个高效、最终低延迟的处理,最好的结果将不需要重复使用 COTS/通用代码,而是更深入地重写自上而下的处理,最好遵循缓存 -行重用模式并尽可能使用 CPU 原生矢量化指令(无论是使用内联汇编代码还是 AVX / AVX2 / AVX512 内在函数)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-11
    • 1970-01-01
    • 2014-02-27
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 2011-06-02
    • 1970-01-01
    相关资源
    最近更新 更多