C++ SSE 过滤器实现

Posted

技术标签:

【中文标题】C++ SSE 过滤器实现【英文标题】:C++ SSE filter implementation 【发布时间】:2013-10-21 10:08:59 【问题描述】:

我尝试使用 SSE 进行 4 像素操作。 我在将图像数据加载到 __m128 时遇到问题。 我的图像数据是一个字符缓冲区。 假设我的图像是 1024 x1024。 我的过滤器是 16x16。

__m128 IMG_VALUES, FIL_VALUES, NEW_VALUES;
//ok:
IMG_VALUES=_mm_load_ps(&pInput[0]);
//hang below:
IMG_VALUES=_mm_load_ps(&pInput[1]);

我不知道如何处理索引 1,2,3...谢谢。

【问题讨论】:

什么是pInput?它是如何声明和初始化的? 【参考方案1】:

如果您确实需要使用浮点而不是整数/定点来执行此操作,那么您将需要加载 8 位数据,解压缩为 32 位(需要两个操作:8 位到 16 位,然后 16 位到 32位),然后转换为浮点数。但是,这非常低效,您应该考虑使用例如16 位定点运算。

请注意,对于每 16 个像素的负载,您将需要处理 4 个 4 x 浮点数的块,即您的 16 x 8 位像素向量将变为 4 x 4 x 浮点数的向量。

所需内在函数的摘要:

_mm_load_si128(...)       // load 16 x 8 bit values

_mm_unpacklo_epi8(...)    // unpack 8 bit -> 16 bit
_mm_unpackhi_epi8(...)

_mm_unpacklo_epi16(...)   // unpack 16 bit -> 32 bit
_mm_unpackhi_epi16(...)

_mm_cvtepi32_ps(...)      // convert 32 bit int -> float

【讨论】:

我认为为这个新副本写一个定点答案会很有趣:***.com/a/32288984/224132。我还制作了一个 unpack-to-FP 和 back 版本。对于无符号像素,这比您预期的要复杂,因为 packuswb 需要 signed 输入。在packusdw 的输出上使用它意味着饱和的 0xffff 字被解释为 -1,并被钳制为零。一旦packusdw 完成了饱和的有符号->无符号转换,我就通过在两个打包步骤之间进行屏蔽来处理这个问题。解压后没问题,用 SSE4.1 pmovzxbd 或 SSSE3 pshufb

以上是关于C++ SSE 过滤器实现的主要内容,如果未能解决你的问题,请参考以下文章

C++ 布隆过滤器原理及实现

C++ 布隆过滤器原理及实现

C++数据结构与算法:布隆过滤器(Bloom Filter)原理与实现

C++进阶第二十四篇——布隆过滤器(概念+实现+海量数据处理问题)

c++——海量数据处理各种面试题(位图的实现和应用,布隆过滤器的应用,哈希切分)

C++进阶第二十四篇——布隆过滤器(概念+实现+海量数据处理问题)