Cache Locality - TLB、Cache Lines 和 ...?

如何解决Cache Locality - TLB、Cache Lines 和 ...?

根据我的理解,产生“缓存局部性”高级概念的结构如下:

  1. 用于虚拟内存翻译的翻译后备缓冲区 (TLB)。在 4096 字节对齐(页面大小)内访问相同的虚拟内存将防止操作系统需要下降分层页表进行转换。

  2. 缓存行意味着在 64 字节对齐(缓存行大小)内访问相同的虚拟内存将防止操作系统需要从 RAM 中获取指令。

我有几个问题:

  1. 我从未见过对典型页表下降的定量估计。以时钟周期衡量,这真的很重要吗?

  2. 我相信 64 字节缓存线是指 L1 缓存线 - L2 / L3 有不同的大小吗?什么情况下内存加载到L2/L3?

  3. 除了缓存行和 TLB 之外,是否还有其他结构可以产生“缓存局部性”?

解决方法

与“缓存局部性”的一般主题相关的缓存存储器层次结构有很多其他与性能相关的功能。在 2007 年的一次演讲中,我提出了 25 种不同的局部性,可能需要考虑这些局部性才能理解受内存访问限制的应用程序的性能! http://dx.doi.org/10.13140/RG.2.2.12967.27048 的演示文稿有两个版本——有和没有演讲者备注。幻灯片 7 提供了“内存层次结构局部域”的(不完整)列表。这包括与地址转换机制相关的局部性、与缓存访问相关的局部性、与 DRAM 访问相关的局部性以及一些其他主题。

,

1. 在大多数 ISA(包括我怀疑您正在考虑的 x86)上,硬件在 TLB 未命中时遍历页表,而不是操作系统。操作系统只是将数据结构放在内存中,并为 CPU 提供顶级页目录的物理地址。 What happens after a L2 TLB miss?。因此,可以在实际需要 TLB 条目之前推测性地完成页面遍历,理想情况下可以隐藏大部分延迟。

遇到 TLB 未命中(但数据的 L1d 命中)的负载的实际延迟会告诉您有关页面遍历延迟的信息,无论您正在测量什么微架构。我没有想到 Skylake 或任何东西的数字;实际成本还取决于页表硬件内部对更高级别的页表进行了多少缓存。 (所以这是另一个局部性来源;在与另一个最近的页面遍历相同的 1GiB 中的页面遍历可能会更快,即使不只使用 1G 或 2M 的巨大/大页面,这样一个 TLB 条目可以覆盖更多的地址空间。)>

2. 一些微架构对 L2 或 L3 使用更大的线,但大多数没有。所有现代 x86 CPU 都使用 64B 线。 (但英特尔的 L2 空间预取器至少会尝试完成一对 128 字节对齐的行。)Line size of L1 and L2 caches

内存在什么情况下加载到L2/L3?

另见Is L2 line fill always triggered on lookup?

取决于 cache inclusion policy,例如独占外部缓存不会有刚刚加载到 L1d 中的内容的副本,受害者缓存也不会(wikipedia,尽管大型 L3 受害者缓存完全关联)。在 x86 世界中,Intel 没有使用通常的受害者缓存(Which cache mapping technique is used in intel core i7 processor?),但 AMD 在一些微架构(例如推土机系列)中使用。 POWER 还使用了 L3 受害者缓存。

除了缓存行和 TLB 之外,是否还有其他结构可以产生“缓存局部性”?

是的,DRAM“页面”(行大小)意味着一个页面内的多个缓存未命中可以让 DRAM 控制器避免选择不同的行,而只需从已经打开的行中读取另一列。更改行会增加超出正常成本的 DRAM 延迟。

What Every Programmer Should Know About Memory? 涵盖了 DRAM,以及许多关于缓存和缓存局部性优化的内容,并且仍然具有高度相关性。

此外,如上所述,附近页面的页面遍历可能会更快一些。

一个大/hugepage(例如 x86-64 上的 2MiB)让一个 TLB 条目覆盖整个 2M。

连续高速缓存行的顺序读取(或写入)触发硬件预取器在请求访问之前将这些行拉入 L2(甚至 L1d),从而减少未命中延迟。 (或者,如果循环在 ALU 工作上花费的时间足够长,硬件预取可以跟上其访问的速度,则完全避免未命中。)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-
参考1 参考2 解决方案 # 点击安装源 协议选择 http:// 路径填写 mirrors.aliyun.com/centos/8.3.2011/BaseOS/x86_64/os URL类型 软件库URL 其他路径 # 版本 7 mirrors.aliyun.com/centos/7/os/x86
报错1 [root@slave1 data_mocker]# kafka-console-consumer.sh --bootstrap-server slave1:9092 --topic topic_db [2023-12-19 18:31:12,770] WARN [Consumer clie
错误1 # 重写数据 hive (edu)> insert overwrite table dwd_trade_cart_add_inc > select data.id, > data.user_id, > data.course_id, > date_format(
错误1 hive (edu)> insert into huanhuan values(1,'haoge'); Query ID = root_20240110071417_fe1517ad-3607-41f4-bdcf-d00b98ac443e Total jobs = 1
报错1:执行到如下就不执行了,没有显示Successfully registered new MBean. [root@slave1 bin]# /usr/local/software/flume-1.9.0/bin/flume-ng agent -n a1 -c /usr/local/softwa
虚拟及没有启动任何服务器查看jps会显示jps,如果没有显示任何东西 [root@slave2 ~]# jps 9647 Jps 解决方案 # 进入/tmp查看 [root@slave1 dfs]# cd /tmp [root@slave1 tmp]# ll 总用量 48 drwxr-xr-x. 2
报错1 hive> show databases; OK Failed with exception java.io.IOException:java.lang.RuntimeException: Error in configuring object Time taken: 0.474 se
报错1 [root@localhost ~]# vim -bash: vim: 未找到命令 安装vim yum -y install vim* # 查看是否安装成功 [root@hadoop01 hadoop]# rpm -qa |grep vim vim-X11-7.4.629-8.el7_9.x
修改hadoop配置 vi /usr/local/software/hadoop-2.9.2/etc/hadoop/yarn-site.xml # 添加如下 <configuration> <property> <name>yarn.nodemanager.res