使用SIMD指令重写memcpy / memcmp / ...是否适用于大型软件?
如果是这样,为什么gcc默认不为这些库函数生成simd指令。
此外,SIMD是否可以改进其他功能?
答案 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)