diff --git a/study/arch/MESI/README.md b/study/arch/MESI/README.md index ffdf8e4..a92152b 100644 --- a/study/arch/MESI/README.md +++ b/study/arch/MESI/README.md @@ -65,6 +65,7 @@ blogexcerpt: 虚拟化 & KVM 子系统 | 22 | [Spectre原理详解及分支毒化的实现](https://zhuanlan.zhihu.com/p/114680178) | NA | | 23 | [Lecture 11: Memory Data Flow Technique](http://home.eng.iastate.edu/~zzhang/courses/cpre585_f03/slides/lecture11.pdf) | NA | | 24 | [cpu 乱序执行与问题](https://blog.csdn.net/lizhihaoweiwei/article/details/50562732) | NA | +| 25 | [store-queue VS store-buffer](https://stackoverflow.com/questions/24975540/what-is-the-difference-between-a-store-queue-and-a-store-buffer) | NA |
diff --git a/study/arch/topdown/README.md b/study/arch/topdown/README.md index 843a0f4..d4933aa 100644 --- a/study/arch/topdown/README.md +++ b/study/arch/topdown/README.md @@ -155,9 +155,24 @@ blogexcerpt: 虚拟化 & KVM 子系统 ## 3.3 Bad Speculation/投机错误 ------- +| 层级 | 名称 | 描述 | 公式 | +|:---:|:----:|:---:|:---:| +| Level 1 | Bad Speculation | 表示由于预测错误而浪费掉的 pipeline slots 的占比. 主要包括:
1. 触发了 Machine Clear 而浪费了 pipeline slots.
2. 分支预测错误(Branch Mispredict) 而浪费的 pipeline slots. | (INST_SPEC - INST_RETIRED) / (4 * CPU_CYCLES).
1. INST_SPEC: CPU 执行的指令的数目.
2. INST_RETIRED: CPU 执行的指令中正常退休的指令的数目. | +| Level 2 | Branch Mispredict | 当 CPU 遇到分支指令的时候, 为避免 pipeline stalls, 会进行投机执行. CPU 对分支指令的跳转方向和跳转目的地址进行预测, 然后投机执行预测出的路径, 对预测的分支进行取指和执行, 所有处于流水线中的这些分支预测路径上的指令都其实处于推测(speculative)状态, 但是并不是进行提交. 然后在流水线的后续阶段, 比如分支指令实际执行时, 会对之前分支预测的结果进行校验, 一旦发现预测失败, 则必须丢弃这个预测错误的分支上所有的指令及其执行结果, 并对流水线各部件的状态进行恢复. 最终重新从正确的分支进行取指. 这必然造成流水线资源的浪费. | NA | +| Level 3 | Indirect Branch | 间接跳转 | NA | +| Level 3 | Push Branch | 函数调用. 比如 BL/BLR 等. | NA | +| Level 3 | Pop Branch | 有返回值的跳转. 如函数返回等. | NA | +| Level 3 | Other Branch | NA | NA | +| Level 2 | Machine Clear | + ## 3.4 Retring/正常执行 ------- +| 编号 | 描述 | 公式 | +|:---:|:----:|:---:| +| Level 1 | Retring | retired 的 uOps 数量占所有 pipeline slots 的比重, 理想情况下, 我们希望看到所有的 pipeline slots 都能归属于 Retiring, 因为它与 IPC 相关. | INST_RETIRED / (4 * CPU_CYCLES) | + + # 1 参考资料