我正在为跨平台 C 编程一个库,用于对网络摄像头图像进行各种处理。所有操作都是逐像素且高度可并行化的——例如应用位掩码、将颜色值乘以常数等。因此我认为我可以通过使用 SSE/SSE2 内在函数来获得性能。
但是,我遇到了数据格式问题。我的网络摄像头库将网络摄像头帧作为指针 (void*) 提供给包含 ABGR 或 BGR 格式的 24 位或 32 位字节像素的缓冲区。我一直将这些转换为 char* 以便 ptr++ 等行为正确。但是,所有 SSE/SSE2 操作都需要 __m128 或 __m64 数据类型中的四个整数或四个浮点数。如果我这样做(假设我已将缓冲区中的颜色值读入字符 r、g 和 b):
浮动像素[] = {(float)r, (float)g, {float)b, 0.0f};
然后加载另一个充满常量的浮点数组
浮动常量[] = {0.299, 0.587, 0.114, 0.0f};
将两个浮点指针都强制转换为 __m128,并使用 __mm_mul_ps 内在函数来执行 r * 0.299、g * 0.587 等……没有整体性能提升,因为周围的所有洗牌都占用了很多时间!
有没有人对我如何快速有效地将这些字节像素值加载到 SSE 寄存器有任何建议,以便我实际上通过对它们进行操作来获得性能提升?