当使用SIMD指令时,32位图像处理是否比24位图像处理更快?

3

我查看了sse和mmx指令集,没有关于处理三通道图像的指令。当然,对于许多操作,例如将两个图像平均,可以使用相同的指令。但是,当涉及到解开通道乱序或通过线性变换混合不同的通道时,使用32位图像会更容易。

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

2个回答

4

如果您的图像较大且操作简单(如alpha-blending等),则每像素24位更快。

在图像处理中,通常操作非常简单,但执行数百万个操作。因此,从主存到CPU传输数据所用的时间很容易支配算法的性能。

因此,每像素24位的图像比32位/像素的图像具有优势,因为需要移动的数据量减少了四分之一。

编写对24位每像素的图像处理代码是困难的。SSE指令与数据不完全匹配,因此您必须重新排列字节,然后再处理所有不同的对齐方式。

如果您处理的图像很小并适合l1或l2缓存,则情况就不同了,CPU时间将支配性能。在这些情况下,每像素32位执行得更快。


实际上,如果我没记错的话,你可以进行打补丁(我想这被称为缓冲),并在给定大小的补丁或块上进行工作,以适应L1或L2缓存。然后,您将工作块沿矩阵移动。如果flop计数很高,则快速缓存访问将抵消复制补丁的成本。 - SkyWalker

3
在新的x86 CPU上,使用PSHUFB(也称为_mm_shuffle_epi8)可以在几个周期内完成通道分割,而且与由于将像素宽度扩展到32位而产生的额外内存访问相比,它可能更便宜。在旧的没有PSHUFB的x86 CPU上,需要大量洗牌或解包指令,并且32位像素更加高效。
在支持NEON的ARM CPU上,通过加载存储单元免费进行通道分割。在不支持NEON的ARM CPU上,可以使用ARMv6 SIMD指令进行通道分割,每个像素的成本约为3条指令。

我忽略了PSHUFB指令。好提示。谢谢。 - Ralph Tandetzky

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