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++数据结构与算法:布隆过滤器(Bloom Filter)原理与实现
C++进阶第二十四篇——布隆过滤器(概念+实现+海量数据处理问题)