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

lim*_*imi 12 performance sse simd

使用SIMD指令重写memcpy/memcmp/...在大型软件中是否有意义?

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

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

Ben*_*igt 7

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

我有一个自定义的SIMD memchr,它比库版本快得多.尤其是当我发现的第2个或3个字符(例如,我想知道是否有在这行文字的公式,我搜索第一的=,\n,\r).

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

  • @Paul:SIMD更好*总是*.如果由于内存访问跟不上,它并不是非常快,那么该内核就可以用于超线程,省电或推测性乱序执行.正如Crashworks所说,由于预取提示,SSE还会更快地将数据提取到缓存中.如果没有SSE,CPU可能必须在获取数据和执行复制之间交替,SSE都可以并行发生. (2认同)
  • @Paul:(1) 并非所有的 `memcpy` 调用都是针对数千字节的。您可能很容易在具有其他处理的循环内调用 ~20 个字节的 `memcpy`。(2) 现代 CPU 内核不限于处理来自单个线程的指令,因此我提到了超线程。(3) 当读取预取是流水线时,DRAM 延迟不太重要,只有吞吐量重要。(4) 即使 DRAM 吞吐量阻碍了代码,仍然更好地执行复制,因为 CPU 可以在相同的时间内完成工作并且功耗更低(例如,动态降低时钟频率) (2认同)

Cra*_*rks 5

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

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

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

将编译器设置为 SSE 模式也可以使基本数学函数受益匪浅。只需告诉编译器使用 SSE 操作码而不是可怕的旧 x87 FPU,您就可以轻松获得 8 倍的加速。sqrt()