EMMS指令执行时间?
Posted
技术标签:
【中文标题】EMMS指令执行时间?【英文标题】:EMMS instruction execution time? 【发布时间】:2009-03-26 13:23:01 【问题描述】:我在看The Art of Assembly: The MMX Instruction Set",在执行了一些MMX指令之后,需要执行EMMS
指令来重置FPU。它说明了EMMS指令速度很慢。
但是,当我分析 EMMS
执行时间以查看它有多慢时(使用 RDTSC
计算时钟周期),它似乎在 0 个周期内执行。
发生了什么事?是我在某个地方犯了错误还是 Art Of Assembly 已经过时了?
【问题讨论】:
【参考方案1】:在古老的 Pentium MMX 上速度很慢,但在更现代的处理器上却非常快。
不过,MMX 今天基本上已经过时了。使用 SSE2,与 FPU 复用不会有任何问题。
此外,RDTSC 指令可以与其他指令并行执行,这解释了您的测量 - CPU 只是在同一个时钟周期内同时开始执行 RDTSC 和 EMMS...如果您想测量一块时间需要的代码量,您必须就代码对两个 RDTSC 进行序列化 - 通常 CPUID 指令用于此目的。由于您使用的序列化指令本身需要 CPU 周期,因此您还必须测量在您编写的测量装置之间没有代码的情况下它需要多少个周期。
最后一点是,即使在 Pentium MMX 上,EMMS 指令本身也很快完成 - 这是之后的第一条 FPU 指令,它得到了令人讨厌的延迟......
【讨论】:
emms
在大约 2009 年的 Intel CPU 上几乎不是“非常快”。在 Core2 和 Nehalem 上,它是 11 uop,每 6 个周期的吞吐量为 1 (agner.org/optimize)。仅当您有循环时才值得使用 MMX,而不是用于 32 位模式下的一些 64 位整数数学指令或 64 位副本,如果您不能将其内联到更大的函数中。在后来的 CPU(MMX 越来越过时)上,EMMS 甚至更慢,例如Sandybridge 上 31 微指令/18 个周期。
如果你有 SSE2,你根本不需要 x87(除非你真的需要 80 位精度,或者如果 32 位调用约定强制它)。
P5MMX 上的 EMMS 只需要一个时钟;根据 Agner Fog 的指令表,第一条 x87 指令的实际损失约为 58 个时钟。因此,如果没有运行 x87 指令,那么在该 CPU 上只在一堆函数的末尾添加 EMMS 实际上很便宜。【参考方案2】:
您需要一个序列化指令,例如 CPUID,以确保 RDTSC 不会乱序执行。你可以阅读更多here。
【讨论】:
以上是关于EMMS指令执行时间?的主要内容,如果未能解决你的问题,请参考以下文章