【发布时间】:2012-02-10 03:22:56
【问题描述】:
在调试的时候,我经常踩到memcpy和memset的手写汇编实现。这些通常使用流指令(如果可用)、循环展开、对齐优化等来实现......我最近也遇到了这个'bug' due to memcpy optimization in glibc。
问题是:为什么硬件厂商(英特尔、AMD)不能针对具体情况进行优化
rep stos
和
rep movs
这样被认可,并在他们自己的架构上尽可能最快填充和复制?
【问题讨论】:
-
复制答案:因为他们只是不这样做,因此没有人编写这样的代码,因此他们没有理由这样做......(循环继续)
-
@BillyONEal:我不这么认为。对于他们添加的每个新功能,仍然没有编写使用它的代码。
-
是的,但是当添加一项新功能时,它会被添加以在一个或另一个领域显示更好的性能。优化这对 CPU 供应商来说没有意义,因为编译器不会发出类似的代码。
-
@BillyONEal:事实上他们确实如此。 MSVC 上的 memcpy 的内在版本正好扩展为这段代码。
-
英特尔 Ivybridge 和后来的 do 优化了
rep stos和rep movs。英特尔将此称为“快速字符串”支持,或 ERMSB(增强型 Rep Movs/StosB)。有关详细信息,请参阅英特尔的优化手册(链接自 stackoverflow.com/tags/x86/info)。这仍然是一个很好的问题,为什么以前的 CPU 具有rep movstake 的微编码实现不如执行 16B 加载/存储的 SSE 循环快。
标签: c optimization assembly x86 64-bit