CPU 中的 LRU 缓存是如何实现的?

2023-11-21

我正在为面试做准备,想重温一下我对缓存的记忆。如果CPU有一个带有LRU替换策略的缓存,那么它在芯片上实际上是如何实现的呢?每个缓存行会存储一个时间戳记吗?

另外,在双核系统中两个 CPU 同时写入同一个地址时会发生什么情况?


对于只有两种路的传统缓存,每组一个位可用于跟踪 LRU。在对命中的集合进行任何访问时,可以将该位设置为未命中的方式。

对于更大的关联性,状态的数量急剧增加:路数的阶乘。因此,4 路缓存将有 24 个状态,每组需要 5 位,而 8 路缓存将有 40,320 个状态,每组需要 16 位。除了存储开销之外,更新值的开销也更大。

对于 4 路缓存,以下状态编码似乎工作得相当好:两位表示最近使用的路号,两位表示下一个最近使用的路号,以及一位指示是否较高或最近使用的编号较低的方式。

  • 当 MRU 命中时,状态不会改变。
  • 在下一个 MRU 命中时,两个位字段将被交换。
  • 在其他命中时,对另外两个路的编号进行解码,命中的路的编号被放置在第一个两位部分中,并且前一个MRU路编号被放置在第二个两位部分中。最后一位的设置取决于下一个 MRU 路号是否高于或低于最近较少使用的路号not hit.
  • 如果未命中,状态会更新,就像发生了 LRU 命中一样。

由于 LRU 跟踪具有如此大的开销,因此通常使用二叉树伪 LRU 等更简单的机制。在命中时,这样只会更新树的每个分支部分,命中的相关路的一半。对于路数 W 的幂,二叉树 pLRU 缓存每组将具有 W-1 位状态。 8 路高速缓存的路 6 中的命中(使用 3 级二叉树)将清除树底部的位,以指示下半路 (0,1,2,3) 较少最近使用过,清除下一级的较高位以指示这些方式 (4,5) 的下半部分最近较少使用,并设置最终级别的较高位以指示这些方式的上半部分 (7)最近使用较少。不必读取此状态来更新它可以简化硬件。

对于倾斜关联性,不同的方式使用不同的散列函数,已经提出了类似缩写时间戳的东西(例如,“倾斜关联缓存的分析和替换”,Mark Brehob 等人,1997)。使用未命中计数器比循环计数更合适,但基本思想是相同的。

对于两个核心尝试同时写入同一缓存行时发生的情况,这是通过在给定时间仅允许一个 L1 缓存使缓存行处于独占状态来处理的。实际上,存在一场竞赛,一个核心将获得独占访问权。如果只有一个写入核心已经拥有缓存行shared州,它可能更有可能赢得比赛。当缓存行处于共享状态时,缓存只需向该缓存行的其他潜在持有者发送失效请求即可;如果缓存行不存在,则写入通常需要请求缓存行数据以及请求独占状态。

不同内核对同一高速缓存行的写入(无论是相同的特定地址,还是在错误共享的情况下,写入数据行内的另一个地址)可能会导致“高速缓存行乒乓球”,其中不同的内核使高速缓存无效其他缓存中的行以获得独占访问(执行写入),以便缓存行像乒乓球一样在系统中弹跳。

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

CPU 中的 LRU 缓存是如何实现的? 的相关文章

随机推荐

  • 找不到 com.squareup.picasso:picasso:2.5.2

    我添加了毕加索依赖项 但似乎不起作用 我尝试更改版本 但还是没用 这是我的 build gradle 模块 apply plugin com android application android compileSdkVersion 23
  • 如何在 Angular 材质的 Snackbar 上添加 html 内容?

    我已经创建了烤面包机 snackbar 来响应消息 我想在烤面包机 snackbar 上添加 html 内容 以便可以以正确的格式显示多条消息 我努力了 var test h1 The Header h1 p The paragraph o
  • 如何配置jetty监听多个端口

    我只是想配置jetty来监听多个端口 我不需要多个实例 也不需要多个 Web 应用程序 只需要一个码头 一个 Web 应用程序 但监听 2 个或更多端口 默认方式不支持多条目
  • Rails 从控制台调用控制器操作

    我有一个可以创建会话的控制器会话 我想从控制台调用它 例如controller create 这是动作 def create raise request env omniauth auth to yaml auth request env
  • 使用托管标识在 Azure 中对应用程序服务进行身份验证

    我在 Azure 中设置了两个应用程序服务 Parent 和 Child 都公开 API 端点 子级有端点 Get 父级具有端点 Get 和 GetChild 使用 HttpClient 在子级上调用 Get 我希望所有子端点都需要通过托管
  • 为 Tesseract OCR 创建训练图像

    我正在编写一个用于 Tesseract OCR 训练图像的生成器 为 Tesseract OCR 的新字体生成训练图像时 最佳值是 The DPI 字体大小 以磅为单位 字体是否应该抗锯齿 Should the bounding boxes
  • 包含 是否需要链接到 tbb?

    在我的 Ubuntu 20 平台 使用 g 9 3 0 上的项目中 我使用以下行 include
  • 如何在Linux shell脚本或python中找出上周六的日期?

    我有 python 脚本 我需要每天运行它来进行备份 现在我需要找到上周六的日期 因为我需要在脚本中使用它来获取上周六所做的备份 认为 星期六我制作了这个文件 weekly user1 Jul 13 2013 sql 我需要在每天运行的脚本
  • MaxDegreeOfParallelism = Environment.ProcessorCount 减慢了我的 CPU 上的执行时间

    我有以下程序 我从http blogs msdn com b csharpfaq archive 2010 06 01 parallel programming in net framework 4 getting started aspx
  • 可以使用 R 编写 Excel 公式或数据验证吗?

    我正在尝试将 R 数据框写入 Excel 并希望添加具有 Excel 公式和 或数据验证值的其他单元格 列 例如 使用 Excel 中的数据 验证菜单提供允许值的下拉列表 细胞 我查看了 R 软件包 xlsx XLConnect 和 ope
  • 蟒蛇 | tkinter:tkinter.END 是做什么的?

    通过书本学习python 一段代码中使用了tkinter END 没有解释 import tkinter def count text out data Update out data with the total number of As
  • 更改工具栏后退箭头颜色

    你好 在上图中 您可以看到一个后退箭头和一个 部分 标题 我使用附加的 xml 代码更改了标题颜色 但我也想将后退箭头设置为白色 我在互联网上读到了一些答案 但对于这样一个简单的问题来说 它们看起来太复杂了 为什么这样做很简单吗
  • 如何在 Go 构建过程中更改 ~/.cache 目录

    Go build 触及 cache 这是不可取的 如何更改该目录的位置 缓存默认为操作系统定义的用户缓存 目录 但可以通过设置 GOCACHE 来移动 Source 文章来自RSC
  • 使用 sf 将空间坐标集转换为 R 中的多边形

    我的列表中的每个元素都包含一组空间坐标 我想使用 sf 将其转换为多边形 每组坐标都按照我想要 连接点 的顺序排序 并且第一行和最后一行相同 以闭合多边形 每个列表元素都用唯一标识符命名 我希望将其保留为 sf 输出中的属性 我在这里改编了
  • boost::asio ssl 链接错误

    我使用的是 boost 版本 1 47 Visual Studio 2010 我下载了 Windows 的二进制文件并从我的项目首选项链接到 include 目录和 lib 目录 但我仍然无法使用 boost asio 的任何 ssl 功能
  • 在 python 中使用 .csv 按特定列数据排序

    我正在尝试订购一个包含 300 多个条目的 csv 文件 并将其全部输出 并按方言下的一个特定列中的数值排序 这是我到目前为止编写的代码 但它似乎只是在输入数据时输出数据 import csv import itertools from i
  • Flink 中的 java.lang.NoSuchMethodError

    我尝试使用以下方法读取文件 final ExecutionEnvironment env ExecutionEnvironment getExecutionEnvironment DataSet
  • WinForms 全局异常处理?

    我已经实现了具有 DLL 库的软件 其中包含一组类 其中包括我的软件的所有方法 现在我希望能够处理一些全局错误 例如错误 26 它是所有这些类上的非网络相关错误 而不是转到每个类并添加它 我该怎么做呢 If 26是一个例外 那么你可以使用A
  • 在Python中将int转换为二进制字符串

    如何在 Python 中将整数转换为二进制字符串 37 100101 Python 的字符串格式方法可以采用格式规范 gt gt gt 0 b format 37 100101 Python 2 的格式规范文档 Python 3 的格式规范
  • CPU 中的 LRU 缓存是如何实现的?

    我正在为面试做准备 想重温一下我对缓存的记忆 如果CPU有一个带有LRU替换策略的缓存 那么它在芯片上实际上是如何实现的呢 每个缓存行会存储一个时间戳记吗 另外 在双核系统中两个 CPU 同时写入同一个地址时会发生什么情况 对于只有两种路的