cpu - 从内存或缓存中获取指令数据的阶段
问题描述
我找不到任何关于现代 CPU 中指令周期或指令流水线的官方(详细)信息(特别是对于 AMD Zen+ 和更新版本)。
考虑以下指令:
ADD MEM, REG
在哪个阶段从内存中获取 [mem] 操作数的数据?在(解码)之前还是在执行阶段?
解决方案
(...)将 x86 指令动态解码为简单的、类似 RISC 的微指令,然后可以由快速、RISC 风格的寄存器重命名 OOO 超标量内核执行。(...) 大多数 x86 指令解码为 1、2 或 3 μops,而更复杂的指令需要更大的数量。
OOO(乱序执行),意思是:
处理器按照由输入数据和执行单元的可用性支配的顺序执行指令,而不是按照它们在程序中的原始顺序。这样做,处理器可以避免在等待前一条指令完成时处于空闲状态,同时可以处理能够立即独立运行的下一条指令。
来源:维基百科
- 原始的 CISC 指令被解码为类似 RISC 的微指令。
- 现代 CPU 是超流水线的 -超标量导致指令级并行性,这意味着单核能够并行执行多条指令(以及每个时钟周期多条指令)。
- 因为数据依赖于执行顺序不是任意的,所以在给出的示例 (
add [mem], eax
) 中,ALU 部分 (μop) 在获取 的值之前无法完全执行[mem]
。 - “内存操作数在执行单独的μop时加载,然后添加μop才能执行。 ”,就像@peter-cordes所说的那样。
推荐阅读
- flutter - 带有地图的 Flutter Firestore 数组。做他们的工作?
- c# - Console.WriteLine() 错误 CS1503 无法从 'void' 转换为 'bool'
- python - 为什么当我在下面插入一条大线时,vim 会使用 99% 的 CPU?
- aerospike - Aerosike AQL 命令日志记录启用
- vue.js - 在呈现下一页之前等待 Apollo 查询的推荐方式?
- python - 由于无效的连接头,nginx 无法打开 websocket 连接:保持活动状态
- python-3.x - 有人可以向我解释这行代码中发生了什么吗?
- c++ - RegSetValueEx 返回成功,但注册表值未在 regedit 中更新
- python - 如何从 Python3 任意长度的字符串数组构建 QML ListElements
- jquery - HTML CSS 和 jquery:带有水平子菜单的菜单