我正在尝试比较两行pixel
s。
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
所有优化标志。