PIPT L1 缓存的最小关联性也是 VIPT,无需将索引转换为物理索引即可访问集合

Minimum associativity for a PIPT L1 cache to also be VIPT, accessing a set without translating the index to physical

这个问题出现在本科计算机体系结构课程中有关虚拟内存的部分的上下文中。助教和教授都答不上来,网上资源有限

问题:

假设处理器具有以下规格:

现在假设这个处理器有一个 32KB 的 L1 缓存,其标签是根据物理地址计算的。在计算对应于虚拟地址的物理地址之前,为了允许访问适当的缓存集,缓存必须具有的最小关联性是多少?

直觉:

我的直觉是,如果缓存中索引的数量和虚拟页面(又名页面 table 条目)的数量可以相互整除,那么我们就可以检索包含在物理页面中的字节直接从缓存中获取页面,而无需计算该物理页面,从而提供了一个小的加速。但是,我不确定这是否是正确的直觉,并且绝对不知道如何遵循它。有人可以解释一下吗?

注意:我已经计算出 table 页的条目数为 2^19,如果这对任何人有帮助的话。

What is the minimum associativity that cache must have to allow the appropriate cache set to be accessed before computing the physical address that corresponds to a virtual address?

他们只指定缓存在物理上被标记

您可以始终构建虚拟索引缓存,没有最小关联性。即使直接映射(每组 1 路)也能工作。有关 VIPT 与 PIPT(和 VIVT,甚至不寻常的 PIVT)的详细信息,请参阅 Cache Addressing Methods Confusion

这个问题不是微不足道的,我假设他们也意味着 "without creating aliasing problems",所以 VIPT 只是 PIPT(物理索引,物理标记)的加速。您将受益于允许 TLB 查找与获取索引集方式的标签(和数据)并行,而没有任何缺点。

My intuition is that if the number of indices in the cache and the number of virtual pages (aka page table entries) is evenly divisible by each other, then we could retrieve the bytes contained within the physical page directly from the cache without ever computing that physical page

您需要实际地址来检查标签;记住你的缓存是物理标记的。 (虚拟标记缓存确实存在,但通常必须在上下文切换到具有不同页表 = 不同虚拟地址的进程时刷新 space。这曾经用于旧 CPU 上的小型 L1 缓存。)

通常假定两个数都是 2 的幂,因此它们总是可以整除。

页面大小始终是 2 的幂,因此您只需在地址中采用不同的位范围,即可将地址拆分为页码和页内偏移量。

Small/fast 高速缓存大小也总是有 2 个集合的幂,所以索引 "function" 只是从地址中获取一个范围的位。对于虚拟索引缓存:来自虚拟地址。对于物理索引缓存:来自物理地址。 (像大型共享 L3 缓存这样的外部缓存可能具有更高级的索引功能,例如更多地址位的散列,以避免地址彼此偏移 2 的大幂次方的别名。)

缓存 size 可能不是 2 的幂,但是你可以通过非 2 的幂关联性(例如 10 或 12 种方式)来做到这一点并不罕见)而不是非 2 的幂行大小或集合数。索引一个集合后,缓存获取该集合所有路的标签并并行比较它们。 (对于快速的 L1 缓存,通常也会并行获取由行偏移位选择的 data,然后比较器只是将该数据多路复用到输出中,或者为否提出一个标志匹配。)


无别名的 VIPT 要求(如 PIPT)

对于这种情况,您需要所有索引位都来自页面偏移量 下方。它们将 "for free" 从虚拟转换为物理,因此 VIPT 缓存(在 TLB 查找之前对集合进行索引)没有 homonym/synonym 问题。除了性能,就是PIPT。

我对 Why is the size of L1 cache smaller than that of the L2 cache in most of the processors? 的详细回答包括一个关于速度技巧的部分。

显示缓存 没有 具有 属性 并且需要 OS 页面着色以避免同义词问题。

有一些关于缓存大小/关联性的更多说明 属性.

公式:

  • 最小关联性=缓存大小/页面大小

例如具有 8kiB 页面的系统需要 32kiB L1 缓存至少是 4 路关联,以便索引位仅来自低 13.

直接映射缓存(每组 1 路)只能和 1 页一样大:行内字节和索引位总计为页内字节偏移量。直接映射(单向)缓存中的每个字节都必须具有唯一的 index:offset 地址,并且这些位来自完整地址的连续低位。

换句话说,2^(idx_bits + within_line_bits)是每组只有一种方式的总缓存大小。 2^N 是页面大小,对于 N 的页面偏移量(免费转换的页面内字节地址位数)。

实际的套数(在本例中为行数)取决于行大小和页面大小。使用更小/更大的线只会移动偏移位和索引位之间的分界线。

从那里开始,在不从更高地址位进行索引的情况下使缓存更大的唯一方法是每组添加更多方式,而不是更多方式。