确实用SIMD指令重写memcpy / memcmp /…才有意义

|| 用SIMD指令重写memcpy / memcmp / ...在大型软件中是否有意义? 如果是这样,默认情况下,为什么gcc不会为这些库函数生成simd指令。 另外,SIMD是否可以改进其他功能?     
已邀请:
是的,使用SSE指令,这些功能要快得多。如果您的运行时库/编译器实例包含优化的版本,那将是很好的选择,但这似乎并不普遍。 我有一个自定义SIMD
memchr
,比库版本快很多。尤其是当我找到2个或3个字符的第一个字符时(例如,我想知道这行文本中是否有一个等式,我会搜索
=
\\n
\\r
中的第一个)。 另一方面,库函数经过了良好的测试,因此,如果您经常调用它们,那么仅值得编写自己的函数,而探查器显示它们仅占CPU时间的一小部分。     
可能没关系。 CPU比内存带宽快得多,并且编译器的运行时库提供的
memcpy
等实现可能就足够了。在“大型”软件中,无论如何,您的性能都不会受到复制内存的支配(它可能由I / O支配)。 为了真正提高内存复制性能,某些系统具有专用的DMA实现,可用于从内存复制到内存。如果需要大幅提高性能,则可以通过硬件来实现。     
它没有任何意义。如果编译器能够发出SIMD,则应该针对memcpy / memcmp /同类内在函数隐式发出这些指令。 您可能需要明确指示GCC发出带有
-msse -msse2
的SSE操作码;有些GCC默认情况下不启用它们。另外,如果您不告诉GCC优化(即
-o2
),它甚至不会尝试发出快速代码。 将SIMD操作码用于这样的内存工作会对性能产生巨大影响,因为它们还包括缓存预取和其他DMA提示,这些提示对于优化总线访问非常重要。但这并不意味着您需要手动发射它们。尽管大多数编译器通常都在发出SIMD ops,但我使用的每一个至少都会处理它们的基本CRT存储器功能。 通过将编译器设置为SSE模式,基本的数学函数也可以受益匪浅。您只需告诉编译器使用SSE操作码而不是可怕的旧x87 FPU,就可以轻松地在基本ѭ7上获得8倍的加速。     
在x86硬件上,无序处理无关紧要。处理器将实现必要的ILP,并尝试为memcpy发出每个周期的最大加载/存储操作数,无论是SIMD还是标量指令集。     

要回复问题请先登录注册