使用MMX指令处理字符串

Processing string with MMX instructions

本文关键字:字符串 指令处理 MMX 使用      更新时间:2023-10-16

我正在尝试实现一个高性能C++程序,每个周期我将8个字节加载到MMX寄存器,然后对它们进行处理,但我当然希望在到达字符串末尾时停止。

所以这就是我找到的解决方案,每个周期加载8个字节,将每个字节与\0进行比较,如果有\0,则采取预防措施。问题是,如果我的数据是4个字节,并且在第一个周期中我加载了8个字节,那么我从另一个应用程序内存空间加载了4个字节。

这会给我带来麻烦吗?或者只是来自这些字节的"噪音",这对我来说是完全可以接受的,因为我一了解\0字符就会处理它。

SSE2自2001年以来一直是一种东西,现在基本上得到了普遍支持,但也许你有充分的理由坚持使用MMX(可能针对嵌入式P3?)

无论如何,问题仍然存在于SSE2中,是的,进行任意加载是不好的,这些加载可以扩展到已知有效的内存区域之外。C++坚持认为任何超出它的加载都是糟糕的,但在实践中,它唯一能产生影响的方法是,如果你触摸下一页,它是无效的。

使用对齐加载(MMX不区分对齐加载和未对齐加载,但您当然仍然可以对齐地址)可确保如果加载的第一个字节在有效页上,那么最后一个字节也在。因此,如果您首先逐字节处理,直到到达对齐的地址,然后继续进行对齐的加载,您就可以了。

如果您使用SIMD指令来获得更高的性能,那么使用自己的内存分配也是合理的。在您的情况下,您需要分配的内存块是所用SIMD指令宽度的倍数:MMX为8,SSE为16,AVX为32。要做到这一点,最好使用标准函数_mm_malloc和_mm_free(对于Visual Studio)或posix_memalign(对于GCC)。