gpt4 book ai didi

c++ - 为什么这比 memcmp 慢

转载 作者:太空狗 更新时间:2023-10-29 20:27:56 25 4
gpt4 key购买 nike

我正在尝试比较两行 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;
}

然后我发现将值视为整数而不是 float 可以加快速度,现在只比 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 的 MS 实现也是使用 SSE 实现的。我的问题是 MS 实现还有哪些我没有的其他技巧?即使进行逐字节比较,它如何仍然更快?

对齐是一个问题吗?如果 pixel 包含 4 个 float ,是否已经在 16 字节边界上分配了一个像素数组?

我正在使用 /o2 和所有优化标志进行编译。

最佳答案

我已经用 SSE(和 MMX/3DNow!)编写了 strcmp/memcmp 优化,第一步是确保数组尽可能对齐——你可能会发现你必须做第一个和/或最后一个字节“一次一个”。

如果您可以在数据进入循环之前对齐数据 [如果您的代码执行分配],那就太理想了。

第二部分是展开循环,所以你不会得到那么多“如果循环没有结束,跳回到循环的开头”——假设循环很长。

您可能会发现在执行“我们现在离开”条件之前预加载输入的下一个数据也有帮助。

编辑:最后一段可能需要一个例子。此代码假定至少有两个展开循环:

 __m128i x = _mm_load_si128((__m128i*)(a));
__m128i y = _mm_load_si128((__m128i*)(b));

for(int i = 0; i < count; i+=2)
{
__m128i cmp = _mm_cmpeq_epi32(x, y);

__m128i x1 = _mm_load_si128((__m128i*)(a + i + 1));
__m128i y1 = _mm_load_si128((__m128i*)(b + i + 1));

if (_mm_movemask_epi8(cmp) != 0xffff) return i;
cmp = _mm_cmpeq_epi32(x1, y1);
__m128i x = _mm_load_si128((__m128i*)(a + i + 2));
__m128i y = _mm_load_si128((__m128i*)(b + i + 2));
if (_mm_movemask_epi8(cmp) != 0xffff) return i + 1;
}

大致是这样的。

关于c++ - 为什么这比 memcmp 慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14796562/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com