我正在尝试比较两行像素。
pixel
被定义为一个包含4个float
值(RGBA)的struct
。
我没有使用memcmp
的原因是因为我需要返回第一个不同像素的位置,而memcmp
不能做到这一点。
我的第一种实现使用了SSE
内置函数,并且比memcmp
慢了约30%:
inline int PixelMemCmp(const Pixel* a, const Pixel* b, int count)
{
for (int i = 0; i < count; i++)
{
__m128 x = _mm_load_ps((float*)(a + i));
__m128 y = _mm_load_ps((float*)(b + i));
__m128 cmp = _mm_cmpeq_ps(x, y);
if (_mm_movemask_ps(cmp) != 15) return i;
}
return -1;
}
我发现将值视为整数而不是浮点数可以加快速度,现在只比memcmp
慢约20%。
inline int PixelMemCmp(const Pixel* a, const Pixel* b, int count)
{
for (int i = 0; i < count; i++)
{
__m128i x = _mm_load_si128((__m128i*)(a + i));
__m128i y = _mm_load_si128((__m128i*)(b + i));
__m128i cmp = _mm_cmpeq_epi32(x, y);
if (_mm_movemask_epi8(cmp) != 0xffff) return i;
}
return -1;
}
根据我在其他问题上的阅读,微软对
memcmp
的实现也使用了SSE
。我的问题是微软还有哪些技巧,而我不知道呢?尽管它进行逐字节比较,但为什么它仍然更快?对齐是否是一个问题?如果
pixel
包含4个浮点数,那么像素数组已经分配在16字节边界上了吗?我正在使用
/o2
和所有优化标志编译。