我正在阅读The Art of Assembly: The MMX Instruction Set",在执行了一些 MMX 指令后,EMMS
需要执行该指令来重置 FPU。它指出 EMMS 指令很慢。
但是,当我分析EMMS
执行时间以查看它有多慢时(RDTSC
用于计算时钟周期),它似乎在 0 个周期内执行。
这是怎么回事?我是不是在某个地方犯了错误,还是 Art Of Assembly 已经过时了?
它在古老的 Pentium MMX 上很慢,但在更现代的处理器上却非常快。
尽管如此,MMX 今天基本上已经过时了。使用 SSE2,与 FPU 进行多路复用不会有任何问题。
此外,RDTSC 指令可以与其他指令并行执行,这解释了您的测量 - CPU 只是在同一时钟周期内同时开始执行 RDTSC 和 EMMS ......如果您想测量一段代码所花费的时间,您必须针对代码对两个 RDTSC 进行序列化 - 通常使用 CPUID 指令。由于您使用的序列化指令本身需要 CPU 周期,因此您还必须测量在您编写的测量装置之间没有代码的情况下它需要多少个周期。
最后一点是,即使在 Pentium MMX 上,EMMS 指令本身也很快完成 - 这是之后的第一条 FPU 指令,它得到了令人讨厌的延迟......
您需要一个序列化指令,例如 CPUID,以确保 RDTSC 不会乱序执行。你可以在这里阅读更多。