使用 simd 指令时,32 位图像处理是不是比 24 位图像处理快?

Posted

技术标签:

【中文标题】使用 simd 指令时,32 位图像处理是不是比 24 位图像处理快?【英文标题】:Is 32 bit image processing faster than 24 bit image processing when simd instructions are used?使用 simd 指令时,32 位图像处理是否比 24 位图像处理快? 【发布时间】:2012-08-10 14:22:50 【问题描述】:

我查看了 sse 和 mmx 指令集,没有关于 3 通道图像处理的指令。当然,对于许多操作,您可以使用相同的指令,例如平均两个图像。但是当涉及到诸如解洗通道或通过线性变换混合不同通道之类的操作时,使用 32 位图像似乎要容易得多。

24 位与 32 位图像的典型图像处理任务的性能特征如何?

【问题讨论】:

【参考方案1】:

如果您的图像较大且操作简单(例如 alpha 混合等),则 24 位/像素会更快。

图像处理中的操作通常非常简单,但您执行的操作数以百万计。因此,将数据从主存移入和移出到 CPU 所用的时间很容易影响算法的性能。

因此,24 位/像素图像比 32 位/像素图像具有优势,因为需要移动的数据少 1/4。

尽管编写在 24 位/像素下表现良好的图像处理代码是一件痛苦的事。 SSE 指令并不真正适合数据,因此您必须四处打乱字节,然后您必须处理所有不同的对齐方式。

如果您正在处理的图像很小并且适合 l1 或 l2 缓存,那么情况就不同了,CPU 时间将主导性能。在这些情况下,32 位/像素的性能更快。

【讨论】:

实际上,如果我没记错的话,您可以进行修补(我认为这称为缓冲),并在适合 L1 或 L2 缓存的给定大小的补丁或块之上进行工作。然后你沿着矩阵移动你的工作块。如果 flop 计数很高,那么快速缓存访问将抵消复制补丁的成本。【参考方案2】:

在带有 PSHUFB(又名 _mm_shuffle_epi8)的新 x86 CPU 上,通道拆分可以在几个周期内完成,并且由于将像素宽度扩展到 32 位,它可能比产生额外的内存访问更便宜。在没有 PSHUFB 的旧 x86 CPU 上,它需要大量的洗牌或解包指令,而 32 位像素效率更高。

在带有 NEON 的 ARM CPU 上,负载存储单元可以免费完成通道拆分。在没有 NEON 的 ARM CPU 上,可以使用 ARMv6 SIMD 指令来完成通道拆分,成本约为每像素 3 条指令。

【讨论】:

我忽略了 PSHUFB 指令。很好的提示。谢谢。

以上是关于使用 simd 指令时,32 位图像处理是不是比 24 位图像处理快?的主要内容,如果未能解决你的问题,请参考以下文章

现代32位或64位x86汇编

CUDA Scalar 和 SIMD 视频指令的效率

Cortex-M4 SIMD 比 Scalar 慢

知道 OpenMP 4.0 会产生啥 SIMD 指令吗?

在内联 ptx 汇编 CUDA 中使用 SIMD 视频指令

指令,操作系统位数,32位与64位 x86 arm 处理器 ,概念概览