2013-10-21 98 views
0

我试图用SSE做4个像素的操作。 我在将图像数据加载到__m128时遇到问题。 我的图像数据是一个字符缓冲区。 让我说我的形象是1024 x1024。 我的过滤器是16x16。C++ SSE过滤器实现

__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 ...谢谢。

+0

什么是'pInput'?它是如何声明和初始化的? –

+1

阅读文档的时间。 – ypnos

回答

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 
+1

我认为写一个新的重复的定点答案会很有趣:http://stackoverflow.com/a/32288984/224132。我也做了一个unpack-to-FP和back版本。它比你期望的无符号像素更复杂,因为'packuswb'需要* signed *输入。在'packusdw'的输出上使用它意味着饱和的0xffff字被解释为-1,并被钳位为零。一旦'packusdw'完成了带饱和符号 - >无符号转换,我就通过在两个包装步骤之间进行掩饰来解决这个问题。解压缩很好,使用SSE4.1'pmovzxbd'或SSSE3'pshufb'。 –