2015-02-23 18 views
0

我將矢量化代碼從SSE2內在函數轉換爲AVX2內在函數, ,並希望知道如何檢查256i(16位)矢量是否包含任何大於零的元素。下面是在SSE2使用的代碼:如何檢查256i(16位)向量以確定它是否包含大於零的任何元素?

int check2(__m128i vector1, __m128i vector2) 
{ 
    __m128i vcmp = _mm_cmplt_epi16(vector2, vector1); 
    int cmp = _mm_movemask_epi8(vcmp); 
    return ((cmp>0) ? 1 : 0) ; 
} 

我認爲下面的代碼將工作,咬它沒有。

int check2(__m256i vector1, __m256i vector2) 
{ 
    __m256i vcmp = _mm256_cmpgt_epi16(vector1, vector2); 
    int cmp = _mm256_movemask_epi8(vcmp); 
    return ((cmp>0) ? 1 : 0) ; 
} 

我會很感激,如果有人可以告訴

+2

你能解釋它「不起作用」嗎? – Mysticial 2015-02-23 23:22:20

+0

它不會像SSE2代碼那樣返回正確的答案,我懷疑問題與_mm256_movemask_epi8函數有關。 也許它應該被另一個函數替換,不是嗎? – MROF 2015-02-23 23:29:07

+2

請注意'gt'不是'lt'的補碼。你爲什麼改變參數的順序? – user3386109 2015-02-23 23:39:38

回答

0

我覺得你只是一個微不足道的錯誤 - 你的功能應該是:

int check2(__m256i vector1, __m256i vector2) 
{ 
    __m256i vcmp = _mm256_cmpgt_epi16(vector1, vector2); 
    int cmp = _mm256_movemask_epi8(vcmp); 
    return cmp != 0; 
} 

的問題是,_mm256_movemask_epi8返回32個標誌爲一個帶符號的整數,並且你正在測試這個> 0。顯然,如果MS位是1,那麼這個測試將失敗(因爲結果將是< 0)。您沒有看到SSE版本的這個問題,因爲它只返回16位。

+1

感謝大家,特別感謝保羅..它的作品就像一個魅力^ _^ – MROF 2015-02-24 21:18:56

+0

爲什麼隨機匿名投票,我不知道? – 2015-02-26 21:14:01

相關問題