使用SIMD指令重写memcpy / memcmp / ...是有意义的

时间:2011-03-16 05:21:57

标签: performance sse simd

使用SIMD指令重写memcpy / memcmp / ...是否适用于大型软件?

如果是这样,为什么gcc默认不为这些库函数生成simd指令。

此外,SIMD是否可以改进其他功能?

4 个答案:

答案 0 :(得分:6)

是的,使用SSE指令这些功能要快得多。如果您的运行时库/编译器instrinsics包含优化版本会很好,但这似乎并不普遍。

我有一个自定义SIMD memchr,它比图书馆版本快得多。特别是当我找到2或3个字符中的第一个时(例如,我想知道这一行文本中是否有方程式,我会搜索=\n,{{{ 1}})。

另一方面,库函数经过了很好的测试,所以如果你经常调用它们,那么它们只值得自己编写,而分析器显示它们占你CPU时间的很大一部分。

答案 1 :(得分:4)

可能并不重要。 CPU比内存带宽快得多,编译器运行时库提供的memcpy等实现可能已经足够了。在“大规模”软件中,无论如何,你的性能都不会受到复制内存的支配(它可能由I / O主导)。

为了在内存复制性能方面提高真实,一些系统具有DMA的专用实现,可用于从内存复制到内存。如果需要大幅提升性能,硬件就是获得它的方法。

答案 2 :(得分:3)

没有意义。你的编译器应该为memcpy / memcmp /类似的内在函数隐式发出这些指令,如果它能够发出SIMD的话。

您可能需要明确指示GCC使用发出SSE操作码,例如 -msse -msse2;某些GCC默认情况下不启用它们。另外,如果你不告诉GCC进行优化(即-o2),它甚至不会尝试发出快速代码。

将SIMD操作码用于此类内存工作会对性能产生巨大影响,因为它们还包括缓存预取和其他对优化总线访问非常重要的DMA提示。但这并不意味着你需要手动发射它们;尽管大多数编译器通常会发出SIMD操作,但我使用过的每一个都至少处理它们用于基本的CRT内存函数。

从将编译器设置为SSE模式,基本数学函数也可以从中受益匪浅。基本sqrt()上的You can easily get an 8x speedup只是告诉编译器使用SSE操作码而不是可怕的旧x87 FPU。

答案 3 :(得分:1)

在x86硬件上,使用无序处理无关紧要。处理器将实现必要的ILP并尝试为memcpy发出每个周期的最大加载/存储操作数,无论是SIMD还是标量指令集。