我无法找到解释政策如何详细运作的来源。写入策略的组合在Jouppi's Paper中针对感兴趣的人进行了解释。这就是我理解它的方式。
问题是在步骤4和步骤5之间发生的事情。(可以说Cache是使用Miss Status Handling Registers的非阻塞缓存。)
在写入命中之前,CPU是否必须在缓存上重试写入请求? (在将块提取到分配的缓存块之后)
如果没有,那么写入请求数据在哪里?
编辑:我想我在Implementation of Write Allocate in the K86™ Processors找到了答案。它直接写入分配的缓存块,稍后会与读取请求合并。
答案 0 :(得分:1)
它直接写入分配的缓存块,稍后会与读取请求合并。
不,这不是AMD的pdf所说的。他们说存储数据与来自内存的刚刚获取的数据合并,然后然后存储到L1缓存的数据数组中。
使用缓存行粒度缓存跟踪有效性。它没有办法存储"字节3到6有效的事实;当数据从内存到达时保留它们#34;这种逻辑太大了,无法在缓存数组的每一行复制。
另请注意,您找到的pdf描述了AMD的K6微体系结构的一些特定行为,这些行为仅为单核,有些模型只有一级缓存,因此没有缓存一致性协议必要。他们确实使用L1和L2缓存之间的MESI来描述K6-III(模型9)。
写入缓存的CPU必须保留数据,直到缓存准备接受它为止。但是,这不是重试直到成功的过程。它更像是当存储硬件准备好接受该存储时通知存储硬件(即它具有该行活动,并且如果缓存与使用{{3的其他缓存一致)则处于修改状态}})。
在真实的CPU中,MESI protocol(即使没有完全无序的推测执行)。这被称为miss miss miss。 CPU高速缓存连接需要可以并行支持的每个未完成未命中的缓冲区,以保存存储数据。例如一个核心可能有8个缓冲区,并支持8个未完成的加载或存储未命中。在第8个存储器操作中的一个可用之前,第9个存储器操作才能开始发生。在此之前,数据必须保留在CPU的存储队列中。
这些缓冲区可能在加载和存储之间共享,也可能有专用的存储缓冲区。 OP报告在商店缓冲区上搜索发现了许多相关的东西;一个例子是multiple outstanding misses can be in flight at once。
L1缓存实际上是现代高性能设计中CPU核心的一部分。它与内存顺序逻辑紧密集成,需要能够有效地支持lock inc [mem]
等原子操作以及许多其他复杂功能(如内存重新排序)。例如,请参阅this part of Wikipedia's MESI article。
其他一些术语:
远程相关:https://en.wikipedia.org/wiki/Memory_disambiguation#Avoiding_WAR_and_WAW_dependencies调查英特尔IvyBridge的L3缓存的自适应替换策略,使其在扫描大型阵列时更能抵御驱逐有价值的数据。