我查看了 sse 和 mmx 指令集,没有关于 3 通道图像处理的指令。当然,对于许多操作,您可以使用相同的指令,例如平均两个图像。但是当涉及到诸如解洗通道或通过线性变换混合不同通道之类的操作时,使用 32 位图像似乎要容易得多。
24 位与 32 位图像的典型图像处理任务的性能特征如何?
我查看了 sse 和 mmx 指令集,没有关于 3 通道图像处理的指令。当然,对于许多操作,您可以使用相同的指令,例如平均两个图像。但是当涉及到诸如解洗通道或通过线性变换混合不同通道之类的操作时,使用 32 位图像似乎要容易得多。
24 位与 32 位图像的典型图像处理任务的性能特征如何?
如果您的图像较大且操作简单(例如 alpha 混合等),则 24 位/像素会更快。
图像处理中的操作通常非常简单,但您会执行数百万次。因此,将数据从主存移入和移出到 CPU 所用的时间很容易支配算法的性能。
因此,24 位/像素图像比 32 位/像素图像具有优势,因为需要移动的数据少 1/4。
但是,编写在 24 位/像素下表现良好的图像处理代码是一件痛苦的事情。SSE 指令并不真正适合数据,因此您必须四处打乱字节,然后您必须处理所有不同的对齐方式。
如果您正在使用的图像很小并且适合 l1 或 l2 缓存,那么情况就不同了,CPU 时间将主导性能。在这些情况下,32 位/像素的性能更快。
在具有 PSHUFB(又名 _mm_shuffle_epi8)的新 x86 CPU 上,通道拆分可以在几个周期内完成,并且由于将像素宽度扩展到 32 位,它可能比产生额外的内存访问更便宜。在没有 PSHUFB 的旧 x86 CPU 上,它需要大量的洗牌或解包指令,并且 32 位像素效率更高。
在带有 NEON 的 ARM CPU 上,负载存储单元可以免费完成通道拆分。在没有 NEON 的 ARM CPU 上,可以使用 ARMv6 SIMD 指令来完成通道拆分,成本约为每像素 3 条指令。