我將矢量化代碼從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) ;
}
我會很感激,如果有人可以告訴
你能解釋它「不起作用」嗎? – Mysticial 2015-02-23 23:22:20
它不會像SSE2代碼那樣返回正確的答案,我懷疑問題與_mm256_movemask_epi8函數有關。 也許它應該被另一個函數替換,不是嗎? – MROF 2015-02-23 23:29:07
請注意'gt'不是'lt'的補碼。你爲什麼改變參數的順序? – user3386109 2015-02-23 23:39:38