当前位置: 首页 > 知识库问答 >
问题:

VIPT缓存:TLB之间的连接

厍华清
2023-03-14

我只是想澄清这个概念,并能找到足够详细的答案,这些答案可以让我们了解硬件中的一切是如何运作的。请提供任何相关细节。

对于VIPT缓存,内存请求将并行发送到TLB和缓存。

从TLB我们得到了详细的物理地址。从缓存索引中,我们得到一个标签列表(例如,来自属于一个集合的所有缓存行)。

然后将翻译后的TLB地址与标记列表匹配,以找到候选标记。

  • 我的问题是在哪里进行检查?
    • 在缓存中
    • 如果不在缓存中,还有什么地方
    • 是否有从TLB到Cache模块的边带连接来获取与标记地址进行比较所需的翻译物理地址?

    有人能告诉我们这是如何实现的,以及缓存模块之间的连接吗

    我知道这取决于具体的架构和实现。但是,当有VIPT缓存时,你知道的实现是什么?

    谢谢。

共有1个答案

宰父疏珂
2023-03-14

在这个细节层次上,您必须将“缓存”和“TLB”分解为它们的组件部分。它们在一种设计中紧密相连,使用VIPT speed hack并行转换和标记提取(即利用索引位都低于页偏移量,因此被“免费”转换)。相关:为什么在大多数处理器中一级缓存的大小小于二级缓存的大小?)

L1dTLB本身是一种小型/快速内容寻址内存,具有(例如)64个条目和4路集合关联(Intel Skylake)。Hugepages通常使用并行检查的第二(和第三)个数组进行处理,例如,对于2M页面,32个条目4路,对于1G页面,4个条目完全(4路)关联。

但现在,简化你的思维模式,忘掉hugepages。L1dTLB是单个CAM,检查它是单个查找操作。

“缓存”至少由以下部分组成:

  • 将标记数据存储在集合中的SRAM数组
  • 控制逻辑根据索引位来获取一组数据标记。(高性能L1d缓存通常与标签并行地获取集合的所有方式的数据,以减少命中延迟,而不是像使用更大更高度关联的缓存那样等待正确的标签。)
  • 比较器根据翻译后的地址检查标记,如果其中一个匹配,选择正确的数据,或者触发错过处理。(点击后,更新LRU位,将此标记为最近使用)。有关没有TLB的双向关联缓存的基本原理图,请参见https://courses.cs.washington.edu/courses/cse378/09wi/lectures/lec16.pdf#page=17.圆圈内的=< /code>是比较器:如果标记宽度输入相等,则产生布尔真输出。

L1dTLB与L1D缓存并非真正分开。我实际上并不设计硬件,但我认为现代高性能设计中的负载执行单元的工作原理如下:

>

  • AGU从寄存器偏移产生地址。

    (有趣的事实:Sandybridge系列乐观地为简单寻址模式简化了此过程:[reg 0-2047]如果reg值与reg disp位于相同的4k页面中,则与其他寻址模式相比,它的负载使用延迟低1c。如果基偏移位于与基偏移不同的页面中,是否会受到惩罚?)

    索引位来自地址页部分内的偏移量,因此它们不需要从虚拟转换为物理。或转换是不可操作的。只要L1\u大小/关联性良好,PIPT缓存无锯齿的VIPT速度就可以工作

    索引位选择一个集合。标签数据以并行方式获取该集合的所有方式。(这需要消耗功率来节省延迟,并且可能只对L1来说是值得的。更高的关联性(每集更多的方式)L3缓存绝对不是)

    在L1dTLB CAM阵列中查找地址的高位。

    标签比较器接收转换后的物理地址标签和从该集合提取的标签。

    如果存在标记匹配,缓存将按照匹配的方式(使用地址行低位内的偏移量和操作数大小)从数据中提取正确的字节。

    或者,它不必获取完整的64字节行,而是可以在前面使用偏移位从每个方向仅获取一个(对齐的)字。没有有效未对齐负载的CPU肯定是这样设计的。我不知道这是否值得为支持未对齐负载的CPU上的简单对齐负载节省电源。

    但是现代英特尔处理器(P6及更高版本)对未对齐的负载uops没有惩罚,即使是32字节的向量,只要它们不跨越缓存线边界。并行的8种方式的字节粒度索引可能比仅仅获取整个8 x 64字节和在获取TLB时设置输出的muing要花费更多,基于行内偏移量、操作数大小和特殊属性,如零或符号扩展,或广播加载。因此,一旦标记比较完成,来自所选方式的64字节数据可能会进入已经配置好的mux网络,该网络获取正确的字节并进行广播或签署扩展。

    AVX512 CPU甚至可以执行64字节的全线负载。

    如果L1dTLB CAM中没有匹配项,则整个缓存提取操作无法继续。我不确定CPU是否/如何管理此流水线,以便在解决TLB未命中时,其他负载可以继续执行。该过程包括检查L2TLB(Skylake:4k和2M的统一1536条目12路,1G的16条目),如果失败,则进行页面遍历。

    我假设TLB未命中导致标记数据提取被丢弃。一旦找到所需的翻译,它们将被重新提取。在其他负载运行时,没有地方存放它们。

    最简单的说,它可以在翻译准备就绪时重新运行整个操作(包括从L1dTLB获取翻译),但它可以通过缩短流程并直接使用翻译来降低L2TLB命中的延迟,而不是将其放入L1dTLB并再次取出。

    显然,这需要dTLB和L1D真正设计在一起并紧密集成。因为他们只需要互相交谈,这是有道理的。硬件页面走取数据通过L1D缓存。(页表总是有已知的物理地址,以避免问题)。

    是否有从TLB到缓存的边带连接?

    我不会称之为侧带连接。L1D缓存是唯一使用L1dTLB的东西。类似地,L1iTLB仅由L1I高速缓存使用。

    如果有第二级TLB,它通常是统一的,因此L1iTLB和L1dTLB都会检查它们是否遗漏了它。就像拆分的L1I和L1D缓存一样,如果未命中,通常会检查统一的二级缓存。

    外部缓存(L2,L3)是非常普遍的PIPT。转换发生在L1检查期间,因此物理地址可以发送到其他缓存。

  •  类似资料:
    • 本文向大家介绍Hibernate中一级缓存和二级缓存之间的区别,包括了Hibernate中一级缓存和二级缓存之间的区别的使用技巧和注意事项,需要的朋友参考一下 Hibernate支持两种类型的缓存,一种是第一级缓存,另一种是第二级缓存。  一级缓存是会话级缓存,它始终与会话级对象关联。这种类型的缓存用于通过缓存对象的状态来最小化Db交互。 那不是在事务中完成每次修改之后更新,而是仅在事务结束时更新

    • 本文向大家介绍虚拟内存和缓存内存之间的区别,包括了虚拟内存和缓存内存之间的区别的使用技巧和注意事项,需要的朋友参考一下 在计算机环境中,内存是至关重要的部分,因为它是唯一负责系统性能和系统存储容量的部分。众所周知,内存负责任何应用程序的加载和执行,还用于存储其数据,以后可被其使用,因此在加载或安装应用程序之前了解系统的内存配置非常重要。 现在,在本主题中基本上将要讨论的是两种类型的存储器,即虚拟存

    • 本文向大家介绍操作系统中缓冲与缓存之间的区别,包括了操作系统中缓冲与缓存之间的区别的使用技巧和注意事项,需要的朋友参考一下 在这篇文章中,我们将了解操作系统中缓冲和缓存之间的区别- 正在缓冲 它是主内存中的一个区域。 这意味着它与RAM(随机存取存储器)相关联。 缓冲区将数据的原始副本存储在内存中。 缓冲与发送方和接收方之间的数据流速度匹配。 快取 缓存将数据的原始副本存储在内存中。 缓存可以提高

    • 如何在2.1.1中存档相同的行为? 谢谢你。

    • 来自RFC 2616 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1 无缓存 如果 no-cache 指令未指定字段名称,则在未成功与源服务器重新验证之前,缓存不得使用响应来满足后续请求。这允许源服务器阻止缓存,即使缓存已配置为向客户端请求返回过时的响应。 因此,它指示代理重新验证所有响应。 将此与 必须重新验证 当

    • 本文向大家介绍Android缓存之DiskLruCache磁盘缓存的使用,包括了Android缓存之DiskLruCache磁盘缓存的使用的使用技巧和注意事项,需要的朋友参考一下 DiskLruCache和LruCache不同的是,LruCache是内存缓存,而DiskLruCache是指磁盘缓存,顾名思义就是把文件缓存到磁盘,也也就是手机的内存卡中。接下来先简单介绍DiskLruCache的使用