caching - 商店失误影响业绩?
问题描述
我们知道,脏数据不会立即写回 RAM,而是隐藏在存储缓冲区中,然后在时间允许的情况下稍后再写回 RAM。此外,存储转发技术,如果您在将值刷新到缓存/内存之前对同一核心上的同一位置执行后续 LOAD,则存储缓冲区中的值将被“转发”,您将获得的值刚刚存储。这可以与缓存访问并行完成,因此不会减慢速度。
我的问题是 - 在存储缓冲区和存储转发的帮助下,存储未命中不一定需要处理器(对应的核心)停止。因此,存储未命中不会影响总缓存未命中延迟,对吧?
谢谢。
解决方案
DRAM 延迟非常高,因此当缓存未命中存储停止其进程时,存储缓冲区很容易填满并停止将新存储指令分配到后端。存储缓冲区将执行与缓存未命中分离/隔离的能力受到其有限大小的限制。不过,它总是对一些人有所帮助。你是对的,商店更容易隐藏缓存未命中延迟。
对于像 x86 的 TSO 这样的强有序内存模型来说,停止和填满存储缓冲区更多的是一个问题:存储只能按程序顺序从存储缓冲区提交到 L1d 缓存,因此任何缓存未命中的存储都会阻塞存储缓冲区的进度,直到RFO(读取所有权)完成。尽早启动 RFO(在存储到达存储缓冲区的提交端之前,例如在退休时)可以通过在数据需要到达之前让 RFO 运行来隐藏一些这种延迟。
可以将连续存储到同一高速缓存行中的数据合并到一个缓冲区中,当数据从 RAM(或从另一个拥有所有权的内核)到达时,这些缓冲区可以让它们一次全部提交。有一些证据表明,英特尔 CPU 在不违反内存排序规则的有限情况下确实做到了这一点。
- 请参阅为什么退休后的 RFO 不中断内存排序?链接到@BeeOnRope 在 RFO 数据到达之前在英特尔 Skylake 上对此提交进行 LFB 的实验测试。
推荐阅读
- mysql - MySQL:为什么 IN 子句中的第 5 个 ID 极大地改变了查询计划?
- c# - 按列标题排序单击删除列过滤器
- python - 熊猫csv数据框中两点之间的距离
- vba - 我的双参数 vlookup 函数 (VBA) 跳过了我的数据范围的第一行
- excel - 用于复制多个单元格并粘贴到另一个工作表的 Vba 代码
- javascript - 无需刷新即可获取帖子 - Vanilla JavaScript 和 Express.js
- jsf - 从调度的 bean/计时器刷新 JSF/PF 组件
- r - R中值大向量
- python - Python解析器从文本文件中的主机名解析IP地址
- c# - 为什么我的代码不是每次都增加一个变量?