首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用MMX指令处理字符串

使用MMX指令处理字符串
EN

Stack Overflow用户
提问于 2015-11-25 19:47:19
回答 2查看 214关注 0票数 0

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

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

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

EN

回答 2

Stack Overflow用户

发布于 2015-11-25 20:47:55

SSE2从2001年就开始出现了,现在基本上得到了普遍的支持,但也许您有一个很好的理由坚持使用MMX (也许目标是嵌入式P3?)

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

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

票数 4
EN

Stack Overflow用户

发布于 2015-11-25 20:35:25

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33915727

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档