C++ SSE 筛选器实现

C++ SSE filter implementation

本文关键字:实现 筛选 SSE C++      更新时间:2023-10-16

我尝试使用 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... 谢谢。

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

请注意,对于每个 16 像素加载,您将有 4 个 4 x 浮点数块进行处理,即 16 x 8 位像素的向量将变成 4 个浮点数的 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