如何检查 256i(16 位)向量以了解它是否包含任何大于零的元素?
How to examine a 256i (16-bit) vector to know if it contains any element greater than zero?
我正在将矢量化代码从 SSE2 内在函数转换为 AVX2 内在函数,
并想知道如何检查 256i(16 位)向量是否包含任何大于零的元素。以下是 SSE2 中使用的代码:
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) ;
}
如果有人能指点一下,我将不胜感激
我认为您只是遇到了一个小错误 - 您的函数应该是:
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
returns 32 位标记为带符号的 int,而您测试的是 > 0。显然,如果 MS 位为 1,则此测试将失败(因为结果将 < 0)。您没有看到 SSE 版本的这个问题,因为它只有 returns 16 位。
我正在将矢量化代码从 SSE2 内在函数转换为 AVX2 内在函数, 并想知道如何检查 256i(16 位)向量是否包含任何大于零的元素。以下是 SSE2 中使用的代码:
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) ;
}
如果有人能指点一下,我将不胜感激
我认为您只是遇到了一个小错误 - 您的函数应该是:
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
returns 32 位标记为带符号的 int,而您测试的是 > 0。显然,如果 MS 位为 1,则此测试将失败(因为结果将 < 0)。您没有看到 SSE 版本的这个问题,因为它只有 returns 16 位。