2013-10-21 138 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'。 –