CPU如何使容量超关联度×页大小的PIPT L2缓存均匀占用?
我在研究不同平台下不同缓冲区大小的memcpy带宽时发现,部分测试结果性能差异显著,尽管已控制读写量合理,且Linux系统几乎无后台活动。
进一步研究发现,性能波动源于L2缓存组占用不均导致的L2利用率低下。我通过获取某平台的Virtual->Physical映射,从复制缓存行的物理地址中提取比特位得到L2组索引,发现L2缓存组的满载数量与带宽下降高度相关。
涉事L2为PIPT类型,8路组相联,含2个bank,总容量256KB。由此可计算每个bank的缓存组数量为256K / 2 / 64 / 8 = 256,索引256个组需8比特。由于6比特用作偏移量,1比特用于选择L2 bank,因此8比特中有8 - (12 - (6 + 1)) = 3比特来自物理地址的高48位(即与虚拟地址不同的部分)。memcpy的虚拟地址是连续的,但物理地址无需连续(实际也不连续),这解释了性能下降的原因。
但我仅在部分平台观察到该现象:Cortex-A73完全无此表现(推测其L2为分片式),Zen4和Intel Tiger Lake的性能下降极轻微(<10%),而部分平台(尤其是RISC-V核心)性能降幅高达50%!
我理解性能下降的原因,但不清楚**这些表现良好的平台是如何解决该问题的?**据我所知,非LLC的L2通常不分片,而是直接用地址比特位索引。对于容量大于PAGE_SIZE x ASSOCIATIVITY x BANKS的L2,VA->PA映射可能引发组冲突。以Zen4为例,其L2为1MB、8路组相联,根据bank数量,最多有6比特需来自地址的高48位。
请问:操作系统是否会在建立页表时考虑L2的索引机制?所有大容量L2缓存是否都暗藏大量bank?我是否遗漏了关键信息?
内容的提问来源于stack exchange,提问作者aolo2

