erz*_*z11 3 x86 assembly mips pipelining
在我毕业的计算机架构上,教授谈到了 MIPS 中的流水线,但也说由于 x86 指令集的某些情况(我不太记得了),x86 处理器需要有一个额外的逻辑来预处理组装指令和管道。
我不是在寻找直接的数字答案,而不是寻找有关该主题的文档或提示:正在做什么来翻译 x86 指令以允许流水线操作,此逻辑如何工作等。
谢谢一堆。
http://realworldtech.com/ 上的许多论坛主题都在争论“x86 税”在晶体管数量/性能/功率方面对 x86 CPU 的成本,与像 MIPS 这样的简单解码 ISA。
10% 是一个随意猜测的数字。其中一些成本是固定的,不会随着 CPU 变得更强大而扩展。例如,可能需要 3 个额外的流水线阶段才能将 x86 指令解码为复杂度与单独 MIPS 指令相似的 uops 流。具有内存目标的 ADD 可能会解码为加载、添加和存储。(管道某些部分的微融合使它比这更复杂。)
对可变长度 x86 指令进行并行解码非常耗电(在当前设计中每个时钟最多 4 个)。x86 不仅仅是可变长度,确定长度(即下一条指令的开始)需要查看很多位,因为有可选的前缀和各种其他复杂性。 Agner Fog 关于Intel 和 AMD 之间“指令集战争”的博客文章讨论了 x86 操作码编码空间混乱状态的一些成本。(另请参阅他的microarch pdf以了解来自 AMD 和 Intel 的现代 x86 设计中的管道,旨在找到实际代码中的瓶颈/理解性能计数器,但如果您只是好奇 CPU 的工作原理,这也很有趣)。
解码 x86 指令的成本如此之高,以至于英特尔的 Sandybridge 微架构系列使用小型/快速解码 uop 缓存以及传统的 L1 I 缓存。即使是大循环通常也适合 uop 缓存,与从传统解码器运行相比,可以节省功耗并增加前端吞吐量。大多数其他 ISA 无法从解码指令缓存中获得几乎相同的好处,因此它们不使用它们。(Intel 之前曾在 Pentium 4 中试验过解码 uop 跟踪缓存(没有 L1 I 缓存,并且解码器较弱),但 SnB 的 uop 缓存不是跟踪缓存,传统解码器仍然足够快。)
OTOH,x86 的一些遗留包袱(如部分 FLAGS 更新)对管道的其余部分和乱序核心施加了成本。现代 x86 CPU 必须分别重命名 FLAGS 的不同部分,以避免在诸如 DEC / JNZ 之类的东西中出现错误依赖。(其中DEC 不修改 CF)。英特尔尝试不这样做(在 Pentium4 中,又名 netburst 微体系结构系列)。他们认为他们可以强制每个人使用避免 INC/DEC 和使用的编译器重新编译他们的代码add eax, 1(它确实修改了所有标志)。(这个优化建议在他们的官方优化手册中存在了很长时间,在 P4 过时很久之后,很多人认为它仍然相关。)
有些人认为 x86 强大的内存排序语义应该被视为“x86 税”的一部分,它减少了流水线 CPU 可以利用的并行性,但其他人(例如 Linus Torvalds)会认为让硬件为你做这件事意味着你没有在多线程代码中不需要到处都是屏障指令。并且让屏障指令“便宜”(不是完全刷新存储缓冲区或其他任何东西)需要硬件足够详细地跟踪内存排序,以至于它们可能只是使屏障隐含。
| 归档时间: |
|
| 查看次数: |
1680 次 |
| 最近记录: |