使用MMX指令处理字符串 我尝试实现一个高性能的C++程序,每个周期我加载8字节到MMX登记器然后处理它们,但是当然当我碰到字符串的结尾时我想停止。

使用MMX指令处理字符串 我尝试实现一个高性能的C++程序,每个周期我加载8字节到MMX登记器然后处理它们,但是当然当我碰到字符串的结尾时我想停止。,c++,gcc,memory,simd,mmx,C++,Gcc,Memory,Simd,Mmx,这就是我找到的解决方案,每个循环加载8个字节,将每个字节与\0进行比较,如果存在\0,则采取预防措施。问题是,如果我的数据是4个字节,在第一个循环中我加载了8个字节,那么我从另一个应用程序内存空间加载了4个字节 这会给我带来麻烦吗?或者“噪音”来自这些字节,这对我来说是完全可以接受的,因为我会在了解\0字符后立即处理它。如果您使用SIMD指令来实现更高的性能,那么使用自己的内存分配也是合理的。在您的情况下,需要分配的内存块是所用SIMD指令宽度的倍数:MMX为8,SSE为16,AVX为32。要做

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


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

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

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

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

无论如何,这个问题在SSE2中仍然存在,是的,执行任意加载(可以扩展到已知有效的内存区域之外)是不好的。C++坚持认为任何超出它的负载都是不好的,但是在实践中,唯一能使它产生任何差异的方法是,如果你触摸下一页,它就无效了。
使用对齐的加载(MMX没有区分对齐和未对齐的加载,但您当然仍然可以对齐地址)可以确保,如果加载的第一个字节位于有效页面上,那么最后一个字节也是。因此,如果您首先逐字节处理,直到找到对齐的地址,然后继续对齐加载,您就没事了。

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

无论如何,这个问题在SSE2中仍然存在,是的,执行任意加载(可以扩展到已知有效的内存区域之外)是不好的。C++坚持认为任何超出它的负载都是不好的,但是在实践中,唯一能使它产生任何差异的方法是,如果你触摸下一页,它就无效了。
使用对齐的加载(MMX没有区分对齐和未对齐的加载,但您当然仍然可以对齐地址)可以确保,如果加载的第一个字节位于有效页面上,那么最后一个字节也是。因此,如果您先逐字节处理,直到找到对齐的地址,然后继续对齐加载,您就没事了。

您使用的是什么操作系统,允许您从另一个应用程序的内存空间加载?您是否在使用自己的体系结构?几乎所有当前的PC机都至少支持SSE2,您使用的是什么操作系统,允许您从另一个应用程序的内存空间加载?您是否正在使用自己的体系结构?目前几乎所有的PC机都至少支持SSE2,这本身是不够的。做
j=strchr(foo,”)是很常见的;如果(j!=NULL)strcpy(k,j)每个字符串的结尾都需要额外的空间。在任何情况下,使用SIMD指令都不会影响内存对齐。这本身是不够的。做
j=strchr(foo,”)是很常见的;如果(j!=NULL)strcpy(k,j)每个字符串的末尾都需要额外的空间。在任何情况下,使用SIMD指令都不会影响内存对齐。