我正在尝试比较两行pixels。
Apixel被定义为struct包含 4 个float值 (RGBA) 的 a。
我不使用的原因memcmp是因为我需要返回第一个不同像素的位置,但这memcmp是不行的。
我的第一个实现使用SSE内在函数,并且比以下速度慢约 30% memcmp:
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.
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;
}
从我读到的其他问题来看,MS 的实现memcmp也是使用SSE. 我的问题是 MS 实现还有哪些我没有的技巧?即使进行逐字节比较,它如何仍然更快?
对齐是个问题吗?如果pixel包含 4 个浮点数,是否已经在 16 字节边界上分配了像素数组?
我正在编译/o2所有优化标志。