使用SS中的SSE/SSE2内在函数处理字节像素

Ben*_*ert 5 c optimization webcam image-processing

我正在编程,对于跨平台C,一个库来做网络摄像头图像的各种事情.所有操作都是按像素进行并且可高度并行化 - 例如应用位掩码,将颜色值乘以常数等.因此,我认为我可以通过使用SSE/SSE2内在函数来获得性能.

但是,我遇到了数据格式问题.我的网络摄像头库将网络摄像头帧作为指针(void*)提供给包含ABGR或BGR格式的24或32位字节像素的缓冲区.我一直在将它们转换为char*,以便ptr ++等行为正确.但是,在__m128或__m64数据类型中,所有SSE/SSE2操作都需要四个整数或四个浮点数.如果我这样做(假设我已经从缓冲区读取颜色值到字符r,g和b):

float pixel [] = {(float)r,(float)g,{float)b,0.0f};

然后加载另一个充满常量的float数组

float constants [] = {0.299,0.587,0.114,0.0f};

将两个浮动指针转换为__m128,并使用__mm_mul_ps内在函数来执行r*0.299,g*0.587等等...没有整体性能提升,因为所有的洗牌都需要花费很多时间!

有没有人对如何快速有效地将这些字节像素值加载到SSE寄存器中有任何建议,这样我实际上可以通过对它们进行操作来获得性能提升?

Dre*_*ann 1

如果您愿意使用 MMX...

MMX 为您提供了一堆 64 位寄存器,可以将每个寄存器视为 8 个 8 位值。

就像您正在使用的 8 位值一样。

这里有一本很好的入门书。