gpt4 book ai didi

c - 在 C 中使用 SSE/SSE2 内在函数处理字节像素

转载 作者:太空狗 更新时间:2023-10-29 15:07:46 26 4
gpt4 key购买 nike

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

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

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

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

浮点常数[] = {0.299, 0.587, 0.114, 0.0f};

将两个浮点指针都转换为 __m128,并使用 __mm_mul_ps 内部函数执行 r * 0.299、g * 0.587 等等等...没有整体性能提升,因为周围所有的洗牌都占用了太多时间!

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

最佳答案

如果你愿意使用MMX...

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

比如您正在使用的 8 位值。

有一本很好的入门书 here .

关于c - 在 C 中使用 SSE/SSE2 内在函数处理字节像素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1943525/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com