VIPT Cache:TLB 和 Cache 之间的连接?

2023-12-13

我只是想澄清这个概念,并且可以找到足够详细的答案,这些答案可以帮助我们了解硬件中的所有内容实际上是如何工作的。请提供任何相关详细信息。

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

从 TLB 中我们可以获得转换后的物理地址。 从缓存索引中,我们获得标签列表(例如,从属于一组的所有缓存行)。

然后将翻译后的 TLB 地址与标签列表进行匹配以找到候选者。

  • My question is where is this check performed ?
    • 在缓存中?
    • 如果不在缓存中,还能在哪里?
  • If the check is performed in Cache, then
    • 是否有从 TLB 到缓存模块的边带连接来获取 需要翻译后的物理地址与标签地址进行比较吗?

有人可以解释一下“实际上”是如何实现的以及缓存模块和 TLB(MMU)模块之间的连接吗?

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

Thanks.


在这个细节级别,您必须将“缓存”和“TLB”分解为它们的组成部分。它们在使用 VIPT 速度黑客与标签获取并行翻译的设计中非常紧密地互连(即利用所有索引位都低于页面偏移量,从而“免费”翻译。相关:为什么大多数处理器中L1缓存的大小都小于L2缓存的大小?)

L1dTLB 本身很小/速度很快内容可寻址存储器具有(例如)64 个条目和 4 路组关联(英特尔Skylake)。大页通常通过并行检查的第二个(和第三个)数组来处理,例如对于 2M 页面为 32 条目 4 路,对于 1G 页面:4 条目完全(4 路)关联。

但现在,简化你的心理模型并忘记大页面。 L1dTLB 是单个 CAM,检查它是单个查找操作。

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

  • 存储标签+数据的SRAM数组
  • 控制逻辑根据索引位获取一组数据+标签。 (高性能 L1d 缓存通常与标签并行地获取集合中所有方式的数据,以减少命中延迟,而不是像使用更大、关联度更高的缓存那样等待选择正确的标签。)
  • 比较器根据翻译后的地址检查标签,如果其中之一匹配,则选择正确的数据,否则会触发错误处理。 (并且在命中时,更新 LRU 位以将此方式标记为“最近使用”)。有关不带 TLB 的 2 路关联高速缓存的基础知识图,请参见https://courses.cs.washington.edu/courses/cse378/09wi/lectures/lec16.pdf#page=17. The =圆圈内是比较器:如果标签宽度输入相等,则生成布尔 true 输出。

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

  • AGU 根据寄存器 + 位移生成地址。 (如果非零则为段基数。)

    (有趣的事实:Sandybridge 系列乐观地缩短了此过程以实现简单的寻址模式:[reg + 0-2047]如果 reg 值与以下地址位于相同的 4k 页中,则加载使用延迟比其他寻址模式低 1creg+disp. 当基址+偏移量与基址位于不同页面时是否会受到惩罚?)

  • 索引位来自地址的页内偏移部分,因此它们不需要从虚拟转换为物理。或者说翻译是无效的。这种具有 PIPT 缓存非混叠功能的 VIPT 速度只要满足以下条件即可发挥作用:L1_size / associativity <= page_size。例如32kiB / 8 路 = 4k 页。

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

  • 在 L1dTLB CAM 数组中查找地址的高位。

  • 标签比较器接收翻译后的物理地址标签和从该组中提取的标签。

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

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

但现代 Intel CPU(P6 及更高版本)不会因未对齐的加载微指令而受到任何惩罚,即使对于 32 字节向量也是如此,只要它们不跨越缓存行边界即可。并行 8 路的字节粒度索引可能比仅获取整个 8 x 64 字节并在获取+TLB 发生时设置输出复用(基于行内偏移、操作数大小和)的成本更高。特殊属性,例如零或符号扩展或广播负载。因此,一旦标签比较完成,来自所选方式的 64 字节数据可能会进入已配置的多路复用器网络,该网络会获取正确的字节并进行广播或符号扩展。

AVX512 CPU 甚至可以执行 64 字节全行加载。


如果 L1dTLB CAM 中没有匹配项,则整个缓存获取操作将无法继续。我不确定 CPU 是如何设法将其管道化,以便在解决 TLB 未命中问题时其他负载可以继续执行;执行单元可能会在 L1dTLB 更新后重做加载或存储地址。该过程涉及检查 L2TLB(Skylake:4k 和 2M 的统一 1536 条目 12 路,1G 的 16 条目),如果失败,则进行页面遍历。

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

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

显然,这要求 dTLB 和 L1D 真正设计在一起并紧密集成。因为他们只需要互相交谈,所以这是有道理的。硬件页面遍历通过 L1D 缓存获取数据。 (页表始终具有已知的物理地址,以避免出现第 22 条规则/先有鸡还是先有蛋的问题)。

在 Intel CPU 上,显然加载 uop一旦调度器被调度就离开调度器到执行单元,因此它们不会从那里重播。也许加载执行单元或加载缓冲区条目跟踪待处理的 TLB 未命中?加载缓冲区条目跟踪正在进行的高速缓存未命中,但在这种情况下,地址转换已完成并且已知是无故障的,并且它们只需在数据到达时将数据转发到相关微指令。

从 TLB 到 Cache 是否有边带连接?

我不会将其称为边带连接。加载/存储 AGU 是only使用 L1dTLB 的事物。类似地,L1iTLB 仅由也读取 L1i 高速缓存的代码获取单元使用。 (页遍历硬件还需要更新 TLB 条目,可能与加载或存储地址执行单元分开。TLB 更新可以由硬件预取逻辑触发,以预取下一个虚拟页的 TLB 条目。)

如果有二级TLB,它通常是统一的,因此L1iTLB和L1dTLB都会检查它是否丢失。就像分离的 L1I 和 L1D 缓存通常会检查统一的 L2 缓存(如果它们未命中)。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VIPT Cache:TLB 和 Cache 之间的连接? 的相关文章

  • Java固定内存映射

    有没有一种简单 高效的Map允许限制映射使用的内存的实现 我的用例是 我想在创建时动态分配大部分可用内存 但我不希望OutOFMemoryError将来的任何时候 基本上 我想使用这个地图作为缓存 但我想避免像这样的重缓存实现EHCache
  • 如何使用缓存快速重建dockerfile?

    我想优化我的 Dockerfile 我希望将缓存文件保留在磁盘中 但是 当我跑步的时候我发现docker build 它总是尝试从网络获取每个文件 我希望在构建期间共享我的缓存目录 例如 var cache yum x86 64 6 但是
  • nuxt.js - 如何在服务器端为所有客户端缓存 axios 调用

    我正在使用 vue nuxt js 应用程序 我想知道是否可以为所有客户端缓存 axios webservice 调用 我必须获取一些货币参考数据 而每个客户都必须调用这些数据并没有多大意义 有人可以给我一些提示 甚至是一个例子吗 谢谢 这
  • 使用 AFNetworking 的 setImageWithURL 时如何配置缓存

    我在用着setImageWithURL在我的应用程序中下载一些图像 是否可以 指定此图像必须在缓存中保存多长时间 例如 1 周 指定缓存的最大总大小有多大 例如 200 兆 查看图像缓存中有什么 清除缓存 文档 http engineeri
  • ChangeState 之后重置/卸载控制器(调用注销)。 AngularJS

    我正在创建一个应用程序 用户可以从 Facebook 或 Twitter 登录 登录后 用户将被定向到某个主页 在这里 控制器加载并调用我的初始函数 该函数加载特定于该用户的数据 当用户单击 注销 时 令牌将被清除 用户将被定向到登录页面
  • Java8流操作有缓存吗? [复制]

    这个问题在这里已经有答案了 我在我的电脑上运行了下面的示例代码Intel R Xeon R CPU E5 2680 0 2 70GHz 2 CPUs 2 7GHz String format 7s run taken 6d micro se
  • 阻止 Google Chrome 发送 Sec-Fetch 标头

    我想在我的 Web API 2 net framework 4 6 2 应用程序 中缓存静态内容 index html 我编写了 OWIN 中间件 添加了一个cache control响应的标头 允许从浏览器缓存中检索后续请求 OWIN 上
  • ASP.Net 使用状态服务器和缓存增加 MaxProcesses(网络花园)

    我在 IIS7 上有一个 ASP Net 网站 我计划增加 MaxProcesses 以匹配服务器上的核心数量 4 核心 64 位 Windows Server 2008 根据我的阅读 如果我增加 MaxProcesses 来创建一个网络花
  • 缓存 Firebase 请求的云函数并且仅在成功编辑配置文件后重新缓存的示例

    在我的应用程序中 用户个人资料向公众开放 并且仅由个人资料所有者更新 个人资料网址是example com email protected cdn cgi l email protection 并根据文档https firebase goo
  • Rails:控制文件存储缓存大小

    Rails 中基于文件的缓存的文档说 请注意 缓存将不断增长 直到磁盘已满 除非您 定期清除旧条目 不幸的是 它没有提供任何有关如何定期清除旧条目的信息 是否设置合适的值 expires in完成这项工作还是清除缓存背后还有其他某种黑魔法
  • 写入 Django 缓存非常慢

    我曾经将数据库查询缓存在全局变量中以加快我的应用程序的速度 由于这是强烈不建议的 并且它确实产生了问题 所以我想使用任何类型的 Django 缓存 我尝试了 LocMemCache 和 DatabaseCache 但两者都需要 关于15秒设
  • 使用 PHP 自动将引用的 LESS 文件编译为 CSS

    我希望发生以下事情 让流程在服务器端自动化 只需能够像在代码中引用 CSS 文件一样引用 LESS 文件 用户将返回缩小的 CSS 而不是缓存的 LESS 文件 因此编译器不需要运行 除非 LESS 文件已更新 为了这个工作any在我的域内
  • Nestjs如何控制缓存?

    最近读了nestjs的文档 从中学到了一些东西 但我发现了一些让我困惑的事情 In 技术 缓存 https docs nestjs com techniques caching 文档告诉我使用像这样的装饰器 UseInterceptors
  • python 3 suds 缓存不工作

    我正在尝试编写一个通过 Python 访问 Sharepoint 的脚本 已安装以下库 suds jurko ntlm 以下代码成功 但需要接近 20 秒 usr bin env python3 from suds client impor
  • Laravel 5 清除视图缓存

    我注意到 Laravel 缓存视图存储在 storage framework views 随着时间的推移 他们会吃掉我的空间 我该如何删除它们 有什么命令可以吗 我试过php artisan cache clear 但它并没有清除视图缓存
  • Google Chrome 中不缓存动态加载的图像

    使用 jQuery 加载的图像未保存在 Google Chrome 的缓存中 每次都会从服务器下载 情况 我正在使用 jQuery slimbox2 在 灯箱 中加载图片 此时没有什么特别的 我添加了一些 jQuery 代码来检测鼠标光标何
  • 为什么 Rails 托管在 VM 上时会缓存视图文件并共享 Samba 上的代码库

    我有以下设置 我的本地计算机 OS X 上的代码作为 Samba 共享共享 在 Parallels 中运行的 Ubuntu VM 安装共享 在开发模式下运行 Rails 2 1 通过 Mongrel WEBrick 或乘客 如果我对视图进行
  • 何时使用包含引用类型的值类型数组而不是引用类型数组?

    假设我有以下内容 public class MyElement Serializable StructLayout LayoutKind Sequential struct ArrayElement internal MyElement E
  • Blue Dragon Coldfusion 服务器缓存问题

    我有一个在 ColdFusion MVC 框架 Mach II 中构建的应用程序 并托管在蓝龙 ColdFusion 服务器上 它会导致缓存问题 当我添加一个包含一些内容的新页面并加载该页面时 它工作正常 但是 当我在同一个文件中进行一些更
  • LRU算法,实现这个算法需要多少位?

    我有一个关于 LRU 算法的小问题 如果您有一个包含四个块的高速缓存 那么需要多少位来实现该算法 假设您指的是 4 路组关联缓存 完美 LRU 本质上是按照使用顺序为每一行分配一个精确的索引 您也可以将其视为 年龄 因此 4 个元素中的每一

随机推荐