我找不到一个非常详细地解释该政策如何运作的消息来源。编写策略的组合在朱皮纸中为感兴趣者解释。我就是这么理解的。
问题是在第4步和第5步之间会发生什么。(假设Cache是一个使用小姐状态处理寄存器的非阻塞缓存。)
CPU是否必须在缓存上重试写入请求,直到写入命中的发生?(将块取到分配的缓存块后)
如果没有,那么写入请求数据在何处保存?
编辑:我想我在K86™处理器中写分配的实现上找到了我的答案。它将直接写入已分配的缓存块,并将其与稍后的读取请求合并。
发布于 2016-09-04 17:08:59
它将直接写入已分配的缓存块,并将其与稍后的读取请求合并。
不,AMD的pdf不是这么说的。他们说,存储数据与内存中的数据合并,然后存储到L1缓存的数据数组中。
缓存用缓存行粒度跟踪有效性。它无法存储“字节3到6是有效的;当数据从内存到达时保持它们有效”的事实。这种逻辑太大了,无法在缓存数组的每一行中复制。
还要注意的是,你发现的pdf描述了他们的K6微体系结构的一些具体行为,这是单核的,而有些模型只有单一的缓存级别,所以甚至不需要缓存一致性协议。他们使用L1和L2缓存之间的MESI描述K6-III (模型9)。
写入缓存的CPU必须保存数据,直到缓存准备好接受数据为止。不过,这不是一个重试直到成功的过程。这更像是当缓存准备好接受存储时通知存储硬件(也就是说,它已经激活了该行,如果缓存与使用MESI协议的其他缓存相一致,则处于修改状态)。
在实际的CPU中,多个未完成的导弹可以一次飞行。 (即使没有完全无序的投机执行)。这叫小姐下的小姐。CPU<->缓存连接需要一个缓冲区来保存存储数据,以满足每个未完成的错误(并行支持)。例如,一个核心可能有8个缓冲器,并支持8个未完成的负载或存储错误。在8个缓冲区中有一个可用之前,第9个内存操作无法开始执行。在此之前,数据必须留在CPU的存储队列中。
这些缓冲区可能在负载和存储之间共享,也可能有专用的存储缓冲区。OP报告说,在存储缓冲区上搜索发现了许多感兴趣的相关内容;例如这部分维基百科的MESI文章。
在现代高性能设计中,L1缓存实际上是CPU核心的一部分.它与内存顺序逻辑非常紧密地集成在一起,并且需要能够有效地支持原子操作,比如lock inc [mem]和许多其他复杂的操作(比如内存重新排序)。例如,请参见依赖关系。
其他一些术语:
远亲:有趣的帖子研究英特尔艾夫布里奇的L3缓存的自适应替换策略,使得它在扫描一个巨大的数组时更能抵抗驱逐有价值的数据。
https://stackoverflow.com/questions/39317562
复制相似问题