每个缓存(L1、L2、LLC)都可以在写回或写直通模式下工作吗?
在大多数x86微架构中,是的,所有数据/统一缓存都能够进行写回,并且在所有正常DRAM中都使用该模式。
intel core i7处理器使用哪种高速缓存映射技术?有一些详细信息和链接。除非另有说明,否则任何谈论x86的人默认假设DRAM页面将是WB。
AMD Bulldozer采用了一种不寻常的选择,使用写直通L1d与一个小的4k写组合缓冲区连接到L2。这有许多缺点,在回顾中被广泛认为是Bulldozer系列的几个弱点或设计错误之一(AMD在Zen中解决了这个问题)。同时请注意,Bulldozer是一项CMT实验,而不是SMT(两个弱整数核共享一个FPU/SIMD单元,每个核有独立的L1d缓存共享一个L2缓存),系统架构如
https://www.realworldtech.com/bulldozer/3/所示。
当然,Bulldozer的L2和L3缓存仍然是写回(WB)的,架构师们并不疯狂。写回缓存对于降低共享LLC和内存的带宽需求是必不可少的。即使是写通道(write-through)的L1d也需要一个写组合缓冲区,以便让L2缓存变得更大、更慢,从而在L1d未命中时有时能够命中,达到其目的。另请参见
为什么大多数处理器的L1缓存比L2缓存小?
写通道缓存可以简化设计(尤其是单核系统的设计),但通常CPU在几十年前就已经超越了这个阶段。(
写回与写通道缓存?)。如果没有写分配(write-allocate)来避免写入污染缓存,一些非CPU负载有时可能会从写通道缓存中受益。x86有NT存储器来避免这个问题。
因此,如果将页面属性设置为写通道,则它们全部都将是写通道吗?
是的,每个商店都必须在标记为WT的页面中进行DRAM全程操作。
缓存被优化为WB,因为这是每个人都使用的方式,但希望支持将行传递到外部缓存而不从L1d中驱逐。因此,WT并不一定会将存储转换为类似于movntps的缓存绕过/驱逐存储。但是请检查一下;显然,在某些CPU上(例如至少是Pentium Pro系列),L1中的WT存储命中会更新该行,但L2中的WT命中却会驱逐该行而不是将其带入L1d。
“什么时候应该将页面设置为写入-直通?有什么优点?”
基本上永远不需要;(几乎?)所有CPU工作负载都最好使用WB内存。
操作系统甚至不费心让用户空间分配WC或WT DRAM页面变得简单(或可能吗?)。(尽管这当然并不能证明它们从来没有用过。)例如,在
CPU cache inhibition上,我发现
一个链接,介绍了一个Linux补丁,但该补丁从未被合并到主线内核中,该补丁增加了将页面映射为WT的可能性。
WB、WC和UC是常见的普通DRAM、设备内存(尤其是GPU)和MMIO的缓存类型。
我看过至少一篇论文,对某些工作负载进行了WT、WB、UC和WC的基准测试(我搜索了一下,但没有找到,抱歉)。有些人会在测试晦涩的x86内容时包括它,以完整性为例。例如,{{link3:Meltdown背后的微体系结构}}是一篇很好的文章(与您正在学习的相关)。
WT的几个优点之一是,商店很快就会进入L3,其他核心的负载可以击中。这可能值得为每个存储器页面支付额外的成本,特别是如果你小心地将写操作手动组合成一个大的32字节AVX存储器(或64字节AVX512全行写)。当然,只在共享数据的页面上使用它。
我从来没有见过有人建议这样做,也没有尝试过。可能是因为对于大多数用例来说,通过L3进行写入的额外DRAM带宽不值得获得收益。但也可能是因为您可能需要编写内核模块才能以这种方式映射页面。
如果CPU在WT存储器的L2或L3命中时驱逐外部高速缓存,就可能无法完全按照这种方式工作,就像@Lewis评论所述PPro文档中所做的那样。
因此,也许我对WT的目的是错误的,它旨在(或至少可用于)设备内存用例,例如GPU不会修改的视频RAM的某些部分。