存储未命中影响性能吗?

3
我们知道,脏数据不会立即写回到RAM中,而是先存储在存储缓冲区中,稍后再根据时间的允许将其写回到RAM中。此外,如果在值被刷新到缓存/内存之前,在同一核心的相同位置进行后续LOAD操作,则可以使用存储转发技术,从存储缓冲区“转发”该值,并获取刚刚存储的值。这可以与缓存访问并行执行,因此不会影响速度。

我的问题是 - 在存储缓冲区和存储转发的帮助下,存储缺失不一定需要处理器(对应核心)停顿。因此,存储缺失不会对总缓存缺失延迟产生贡献,对吗?

谢谢。

1个回答

4
DRAM延迟非常高,因此当缓存未命中时,存储缓冲区很容易填满并阻止新的存储指令分配到后端。存储缓冲区将执行与缓存未命中的隔离/分离能力受其有限大小的限制。尽管如此,它总是有所帮助。你是对的,相对于缓存未命中的延迟,存储更容易隐藏。
在像x86 TSO这样具有强序内存模型的情况下,停顿和填充存储缓冲区更成为问题:存储只能按程序顺序从存储缓冲区提交到L1d缓存,因此任何缓存未命中的存储都会阻塞存储缓冲区的进度,直到RFO(所有权读取)完成。提前启动RFO(在存储达到存储缓冲区的提交末端之前,例如在退役时)可以通过在数据到达之前使RFO飞行来隐藏一些延迟。

连续存储到相同的高速缓存行中可以合并为一个缓冲区,让它们在数据从RAM(或拥有权的另一个内核)到达时一次性提交。有证据表明,在不违反内存排序规则的有限情况下,Intel CPU实际上会这样做。


1
也许值得补充一下,如果在商店之后有大量的存储操作,那么如果预测要进行序列化(无论是通过内存消歧义单元还是仅仅进行4K对齐),则可以在SB填充之前暂停执行。 - undefined
@dalglish:它被驱逐到下一级缓存,而不是全部到主内存。L2和L3当然也是写回缓存,否则对于某些工作负载,当你的数组刚好超过L1d缓存的容量时,性能将会大幅度下降。你可以查看memset / memcpy与大小基准测试来了解实际效果。 - undefined
@PeterCordes 谢谢。你有没有关于在实际机器中实施写回策略的文档可以推荐? - undefined
@Peter 谢谢。还有一个问题,如果我们考虑L1d和L2之间的访问,那么当L1数据缓存中发生一次加载未命中时,由于写缓冲区正在向L2写入,会增加惩罚吗?我的意思是,如果写缓冲区正在向L2写入,那么对L2的加载访问是否需要暂停?我记得L1d和L2之间的带宽只有64B。 - undefined
@dalglish: 我对细节不太清楚。我猜应该会有一些缓冲,这样L1就可以在出站线路传输时请求新的数据行。可能只是通过LFBs来实现。所以,如果在开始驱逐后没有空闲的LFB,那么如果伪LRU选择了一个脏行进行驱逐,加载缺失可能必须等待。除非同一个LFB可以在同一事务中既发送一行到L2,又请求一行返回?我在这里大部分都是猜测它可能是如何工作的,但考虑到我们对Intel CPU的其他了解,这些猜测是合理的。 - undefined
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接