为什么大多数处理器中L1缓存的大小都小于L2缓存的大小?

2024-01-08

为什么大多数处理器的L1高速缓存的大小都小于L2高速缓存的大小?


L1 与 CPU 核心紧密耦合,并且在每次内存访问时都会被访问(非常频繁)。因此,它需要非常快地返回数据(通常在一个时钟周期内)。延迟和吞吐量(带宽)对于 L1 数据缓存来说都是性能关键。 (例如,四个周期延迟,并支持 CPU 内核每个时钟周期进行两次读取和一次写入)。它需要大量的读/写端口来支持这种高访问带宽。使用这些属性构建大型缓存是不可能的。因此,设计师将其保持较小,例如目前大多数处理器为 32KB。

L2 仅在 L1 未命中时访问,因此访问频率较低(通常是 L1 的 1/20)。因此,L2 可以具有更高的延迟(例如 10 到 20 个周期)并且具有更少的端口。这使得设计师可以将其做得更大。


L1 和 L2 扮演着截然不同的角色。如果 L1 变大,则会增加 L1 访问延迟,这将大大降低性能,因为它会使所有相关加载变慢并且更难隐藏乱序执行。 L1 的大小几乎没有争议。

如果我们删除 L2,L1 未命中将不得不进入下一个级别,比如内存。这意味着大量访问将进入内存,这意味着我们需要更多的内存带宽,这已经是一个瓶颈。因此,保留 L2 是有利的。

专家通常将 L1 称为延迟过滤器(因为它使 L1 的常见情况命中速度更快),将 L2 称为带宽过滤器,因为它减少了内存带宽的使用。

注意:我假设了2级缓存层次结构 https://en.wikipedia.org/wiki/CPU_cache#Multi-level_caches在我的论点中使其变得更简单。在当今的许多多核芯片中,所有内核之间共享 L3 缓存,而每个内核都有自己的私有 L1,也许还有 L2。在这些芯片中,共享的末级缓存(L3)起着内存带宽过滤器的作用。 L2 起着片上带宽过滤器的作用,即它减少了对片上互连和 L3 的访问。这使得设计人员能够使用较低带宽的互连(如环)和慢速单端口 L3,从而使 L3 变得更大。

也许值得一提的是,端口数量是一个非常重要的设计点,因为它会影响缓存消耗的芯片面积。端口向高速缓存添加线路,这会消耗大量芯片面积和功耗。

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

为什么大多数处理器中L1缓存的大小都小于L2缓存的大小? 的相关文章

  • 如何查找页面上R图形的字节大小?

    我想监控 R 在各个页面上生成的图形的基本质量 例如每个页面的字节大小 我现在只能对平均页面进行质量保证 请参阅下面的章节 我认为这项任务必须有一些比一般措施更内置的东西 生成 4 页的代码Rplots pdf我想知道此处输出中每个页面的字
  • 如何估计 std::map 的内存使用情况?

    例如 我有一个已知 sizeof A 和 sizeof B 的 std map 而 map 内部有 N 个条目 您如何估计其内存使用情况 我想说这就像 sizeof A sizeof B N factor 但到底是什么因素呢 也许不同的公式
  • Google Chrome 中不缓存动态加载的图像

    使用 jQuery 加载的图像未保存在 Google Chrome 的缓存中 每次都会从服务器下载 情况 我正在使用 jQuery slimbox2 在 灯箱 中加载图片 此时没有什么特别的 我添加了一些 jQuery 代码来检测鼠标光标何
  • 你可以推荐什么 JavaScript 缓存 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个好的javascript内存缓存库来缓存客户端计算结果 我的要求 适用于 Internet Explorer FireFox
  • 限制 Java 进程的总内存消耗(在 Cloud Foundry 中)

    与这两个问题相关 如何设置JVM的最大内存使用量 https stackoverflow com questions 1493913 how to set the maximum memory usage for jvm 什么会导致 jav
  • 查找可以为 C# 中的数组分配多少内存

    我正在做一些需要初始化大数组的计算 数组的最大大小决定了我能解决的问题的最大大小 有没有一种方法可以以编程方式确定有多少内存可供使用 例如可能的最大字节数组 Thanks 嗯 依赖单个大数组会带来一系列相关问题 内存碎片 连续块 最大对象大
  • 何时使用包含引用类型的值类型数组而不是引用类型数组?

    假设我有以下内容 public class MyElement Serializable StructLayout LayoutKind Sequential struct ArrayElement internal MyElement E
  • /sys/device/ 和 dmidecode 报告的不同 CPU 缓存大小

    我正在尝试获取系统中不同缓存级别的大小 我尝试了两种技术 a 使用 sys device 中的信息 这是输出 cat sys devices system cpu cpu0 cache index1 size 32K cat sys dev
  • Blue Dragon Coldfusion 服务器缓存问题

    我有一个在 ColdFusion MVC 框架 Mach II 中构建的应用程序 并托管在蓝龙 ColdFusion 服务器上 它会导致缓存问题 当我添加一个包含一些内容的新页面并加载该页面时 它工作正常 但是 当我在同一个文件中进行一些更
  • 如何为客户端和服务器缓存设置不同的缓存过期时间

    我想让某些页面为客户端提供 10 分钟缓存 为服务器提供 24 小时缓存 原因是如果页面发生变化 客户端将在 10 分钟内获取更新版本 但如果没有任何变化 服务器只需每天重建一次页面 问题在于输出缓存设置似乎覆盖了客户端设置 这是我的设置
  • R foreach问题(某些进程返回NULL)

    我遇到了问题foreach我正在 R 中使用的程序的一部分 该程序用于运行不同参数的模拟 然后将结果返回到单个列表 然后用于生成报告 当并非所有分配的模拟运行都在报告上实际可见时 就会出现问题 从各方面来看 似乎只有分配的运行的一个子集实际
  • 在apache中有条件地设置缓存头

    我想根据访问文件的路径有条件地设置缓存标头 基本上 访问http www example com cache cache key 应该为具有遥远未来缓存标头的文件提供服务 我使用重写规则来设置环境变量 然后尝试根据该变量设置缓存控制标头 然
  • 调整巨大数组的大小

    我正在我的应用程序中处理巨大的数组 需要调整它们的大小 假设您有一个 2Gb 的阵列 并且想要将其大小调整为 3Gb 有没有办法在暂时不需要 5Gb 的情况下调整它的大小 例如 给定一个 1Gb 堆 使用 Xmx1G flag public
  • 指针和内存范围

    我已经用 C 语言编程有一段时间了 但对 C 语言还是很陌生 有时我对 C 处理内存的方式感到困惑 考虑以下有效的 C 代码片段 const char string void where is this pointer variable l
  • 如何在iOS中查找文本段范围

    如何在 iOS 中找到文本段 又名代码段 范围 意思是 文本段的起始地址和结束地址是多少 I found 这个有趣的帖子 http www pschweitzer fr p 12但它适用于 Android 但不适用于 iOS 经过一些挖掘和
  • 如何从内存加载值而不污染缓存?

    我想读取内存位置而不污染缓存 我正在 X86 Linux 机器上工作 我尝试使用 MOVNTDQA 汇编指令 asm movntdqa source dest n t dest x my var source m my mem 0 memo
  • 如果 Redis 已经是堆栈的一部分,为什么 Memcached 仍然与 Redis 一起使用?

    Redis 可以执行 Memcached 提供的所有操作 LRU 缓存 项目过期以及现在版本 3 x 中的集群 目前处于测试阶段 或通过 twemproxy 等工具执行 性能也类似 此外 Redis 增加了持久性 因此您无需在服务器重新启动
  • 如何获取可用系统内存的大小?

    C NET 中是否可以获取系统可用内存的大小 如果是的话怎么办 Use Microsoft VisualBasic Devices ComputerInfo TotalPhysicalMemory http msdn microsoft c
  • 使用自定义堆的类似 malloc 的函数

    如果我希望使用自定义预分配堆构造类似 malloc 的功能 那么 C 中最好的方法是什么 我的具体问题是 我有一个可映射 类似内存 的设备 已将其放入我的地址空间中 但我需要获得一种更灵活的方式来使用该内存来存储将随着时间的推移分配和释放的
  • 处理器关联组 C#

    我使用的是 72 核的 Windows Server 2016 我看到有两组处理器 我的 net 应用程序将使用一个或其他组 我需要能够强制我的应用程序使用我选择的组 我看到下面的代码示例 但我无法使其工作 我可能传递了错误的变量 我希望应

随机推荐

  • 将声明复制为标头已被弃用,并将从 v4.0 中删除 - lcobucci/jwt 包中的 Laravel Passport Problem

    我在用着laravel passport 7 5 1包在我的 laravel 项目中 最近遇到了这个异常 任何想法 我暂时降级了lcobucci jwt 3 4 0打包到lcobucci jwt 3 3 3 Replicating clai
  • python:pandas - 如何将 pandas 数据帧的前两行合并到数据帧标题?

    我正在尝试读取一个 Excel 文件 如下所示 我还有一个脚本 可以将此 xlsx 文件转换为带有工作表名称的 csv 文件 如果三张工作表可用 那么它将创建三个不同的 csv 文件 它的 csv 文件如下所示 Unnamed 0 Gend
  • SQL 排序规则影响性能

    我只想检查几件事 Q1 Latin1 General CI AS 不区分大小写 区分重音 即SQL 会将以下内容视为相等 hello 和 HELLO 使用 LINQ 我经常这样做 db Where v gt v Email some ema
  • Numpy 相当于 list.index

    在多次调用的低级函数中 我需要执行与 python 的 list index 相同的操作 但使用 numpy 数组 该函数需要在找到第一个值时返回 否则引发 ValueError 就像是 gt gt gt a np array 1 2 3
  • 如何横向打印 HTML?

    这个问题已被提出并得到回答 但高度赞成的接受答案都是 没有解释如何做 不起作用 The reason of course is that the accepted answer1 https stackoverflow com a 1392
  • 包含所有 ascii 字符的字符串

    我想在 JavaScript 中创建一个包含所有 ASCII 字符的字符串 我怎样才能做到这一点 const s 0123456789 lt gt ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrs
  • Python 在 O(n) 时间和 O(1) 内存中查找多数数 [重复]

    这个问题在这里已经有答案了 我正在研究我的算法解决技能 但我在解决 O 1 内存复杂度的问题时遇到了困难 问题陈述 给定一个整数数组 您的任务是将多数数打印到标准输出 stdout 如果一个数字在大小为 N 的数组中出现超过 N 2 次 则
  • HTTP/1.1 响应多个范围

    在编写 HTTP 1 1 服务器时 我在处理多个范围请求时陷入困境 RFC 2616 的第 14 35 1 节引用了一些示例 但没有阐明服务器行为 例如 GET some resource HTTP 1 1 Range bytes 200
  • C# 中的数据加密和密钥管理

    走哪条路 有什么利弊 哪条更安全 1 生成 AES 密钥 用它加密数据 然后用 RSA 加密 AES 密钥 将加密数据和加密 AES 密钥保存到文件中 并将 RSA 密钥对保存到 KeyContainer 2 或者使用 DPAPI Prot
  • 如何停止/使 NStimer 失效

    我在用 NSTimer scheduledTimerWithTimeInterval 0 1f target self selector selector update userInfo nil repeats YES 我不想再把这个计时器
  • Mysql 将 XXXXXXXXXXXX 这样的字符串格式化为 XX-XX-XXXXXXX-X

    我需要一个看起来像 XXXXXXXXXXXX 的字符串 看起来像这样 XX XX XXXXXXX X 我不知道 MySQL 中是否有函数或模式工具可以做到这一点 你 在 MySQL 中 实现此目的的一种方法是使用带有 SUBSTRING 和
  • Rails 嵌套连接 Activerecord 有条件

    我正在尝试编写带有条件的嵌套连接查询 我现在的查询是 Event joins store gt retailer where store retailer id 2 其输出以下 SQL SELECT events FROM events I
  • 如何对现有应用程序进行 dockerize...基础知识

    我使用的是 Windows 并安装了 boot2docker 我已经从 docker hub 下载了图像并运行基本命令 但 如何获取本地计算机上的现有应用程序 假设它有一个文件index php 为简单起见 我如何将其放入 Docker 映
  • 如何在 C++/CLI 中包装 C 库回调

    给定以下具有要求设置缓冲区的回调事件的 C 库 如何以类型安全的方式编写正确的 C CLI 包装器 The callback signature typedef void cdecl BUFFERALLOCATOR void opaque
  • 使用 git rebase 意外地将其他人的提交添加到我的 PR 中

    我打算在一个功能上做更多的工作 在编码之前我跑了git pull rebase upstream master 然后跑了git push origin feature branch 这导致了我随后运行的那些 快进 错误之一git pull
  • PHP目录权限检查

    我有一个 PHP 脚本 需要检查目录的权限以确保它可写 到目前为止我所拥有的是 perms substr sprintf o fileperms folder 4 if perms 0777 is writable temp DS code
  • Haskell - 如何写 (.) f f = (\x -> f (f x))

    我需要编写一个要在 GHCi 上运行的模块 并将函数组合为相同的函数 这个 经典fog x f g x runs f g x gt f g x 当我尝试这样写时出现问题 f f x gt f f x fof x f f x GHCi 说 C
  • Cmake查找模块以区分共享库或静态库

    我有一个使用 libCrypto 的 cmake c 项目 我托管了 FindCryptoPP cmake 模块here https github com mateuszzz88 FindCryptoPP cmake blob master
  • IEnumerable、Arity 和泛型类型定义

    我有课Counter按键对事物进行计数 简化 public class Counter
  • 为什么大多数处理器中L1缓存的大小都小于L2缓存的大小?

    为什么大多数处理器的L1高速缓存的大小都小于L2高速缓存的大小 L1 与 CPU 核心紧密耦合 并且在每次内存访问时都会被访问 非常频繁 因此 它需要非常快地返回数据 通常在一个时钟周期内 延迟和吞吐量 带宽 对于 L1 数据缓存来说都是性