我正在尝试实现一个高性能的C++程序,每个周期我加载8个字节到MMX寄存器,然后处理它们,但当然我想在遇到字符串末尾时停止。
这就是我找到的解决方案,每个周期加载8个字节,将每个字节与\0进行比较,如果有\0,则采取预防措施。这样做的问题是,如果我的数据是4个字节,并且在第一个周期中我加载了8个字节,那么我从另一个应用程序的内存空间加载了4个字节。
这会给我带来麻烦吗?或者只是“噪音”来自这些字节,这对我来说是完全可以接受的,因为一旦我了解了\0字符,我就会处理它。
发布于 2015-11-25 20:47:55
SSE2从2001年就开始出现了,现在基本上得到了普遍的支持,但也许您有一个很好的理由坚持使用MMX (也许目标是嵌入式P3?)
无论如何,这个问题仍然存在于SSE2中,是的,执行可能超出已知有效内存区域的任意加载是不好的。C++坚持认为,任何超出它的加载都是不好的,但在实践中,它能产生任何影响的唯一方法是,如果你触摸下一页,它是无效的。
使用对齐加载(MMX不区分对齐加载和未对齐加载,但当然您仍然可以对齐地址)可以确保如果加载的第一个字节在有效页面上,那么最后一个字节也在有效页面上。因此,如果您首先逐个字节地处理,直到到达一个对齐的地址,然后继续执行对齐的加载,那么您就没问题了。
发布于 2015-11-25 20:35:25
如果您使用SIMD指令来实现更高的性能,那么使用您自己的内存分配也是合理的。在您的情况下,您需要分配的内存块是所用SIMD指令宽度的倍数:8个用于MMX,16个用于SSE,32个用于AVX。为此,最好使用标准函数_mm_malloc和_mm_free (适用于Visual Studio)或posix_memalign (适用于GCC)。
https://stackoverflow.com/questions/33915727
复制相似问题