硬件预取之空间预取

news2024/9/24 17:35:22

《data prefetching techniques in computer system》翻译之空间预取器

2 Spatial prefetching

数据预取器需要在应用程序运行时预测处理器未来的内存访问。为此,它们通常依赖于数据访问之间的循环模式或相关性。在处理器上运行时,应用程序的数据访问中出现的模式特定相关性越多,数据预取器就越能更好地预测未来的内存引用。

空间数据预取器通过依赖空间地址相关性来预测未来的内存访问。空间地址相关性是指多个内存区域间数据访问模式的相似性。访问模式演示了空间相关性,因为应用程序使用具有规则的并且固定布局,并且遍历数据结构时会重新进行访问[1]。

例如,应用程序可以使用结构体数组,而该结构体有多个元素。访问不同数据结构的模式很可能是相似的(有时是相同的)。图1显示了几个内存区域的访问模式。在这个图中可以看到访问模式的相似性。这种访问模式与内存区域(在本例中,与结构体相关的内存区域)的相似性被称为空间相关性。

有几种空间数据预取器[1-10]。这些预取器将内存地址空间划分为固定大小的部分,称为空间区域,并学习这些部分的内存访问模式。当应用程序触及相同或类似的空间区域时,学习访问模式用于预取未来的内存引用。在本章中,我们将讨论空间预取器学习空间区域访问模式的机制,以及它们如何将所学应用于未来类似空间区域的预取。

空间数据预取器的优点之一是它们施加的面积开销很小,因为它们存储偏移量(offset即,块地址从空间区域开始的距离)增量(delta即,落入空间区域的两个连续访问的距离)作为它们的元数据信息,而不是完整的地址。空间数据预取器的另一个同样显著的优点是它们能够消除强制缓存丢失[11]。

强制缺失是指地址第一次被缓存看到的缓存缺失。这些失误也被称为冷启动失误或首次引用失误。当缓存第一次看到这些地址时,这样的数据访问通常会在缓存中丢失。因此,在重要的应用程序类别中,强制缓存缺失是导致性能下降的主要原因,例如,scan-dominated的工作负载,其中scan大量数据产生大量不可见的内存访问,无法被缓存捕获[1]。通过将在过去的空间区域中观察到的模式利用到新的未观察到的空间区域,空间预取器可以减轻强制缓存丢失,从而显着提高系统性能。

空间数据预取的关键限制是它无法预测指针跟踪导致的缓存丢失[12-16]。例如,对于链表,每个元素都是动态地分配到内存中的某个位置,并且元素之间不一定是相邻的。相反,它们使用指针连接在一起。通常,由于动态对象可能被分配到内存中的任何地方,因此不一定彼此相邻,因此指针跟踪访问通常不会显示空间相关性。相反,它们会产生大量依赖的缓存缺失,由于缺乏空间地址相关性,空间预取器几乎做不了这些缓存缺失。

我们介绍了两种最先进的空间预取技术:(1)spatial memory streaming (SMS 2006’ISCA)[2],(2)VLDP[4]。

2.1 spatial memory streaming(SMS 2006’ISCA)

SMS是一种最先进的空间预取器,它是在服务器和科学应用的背景下提出和评估的。每当第一次请求某个空间区域时,只要应用程序正在积极使用该空间区域,SMS就开始观察并记录对该空间区域的访问。每当空间区域不再被使用时(即空间区域的相应块开始从缓存中被清除),SMS将观察到的访问信息存储在其元数据表中,称为模式历史表(PHT)

PHT中的信息以_<event, pattern>_的形式存储。event(pc+addr/pc+offset/addr/offsetd等)是一条与观察到的访问模式相关联的信息。也就是说,如果将来事件再次发生时使用相应的存储访问模式。SMS根据经验选择PC +触发访问的偏移量 (即,第一次访问空间区域的指令的PC加上第一个请求的缓存块与空间区域开始的距离)作为访问模式相关的事件。这样,每当PC + Offset重新出现时,相关的访问模式历史记录将用于发出预取请求。模式是发生在每个空间区域的访问历史。SMS将访问模式编码为位向量。通过这种方式,对于空间区域中的每个缓存块,存储一个位,表示该块是否有在最近一次使用空间区域使用有则标记为(’ 1 ‘)若无则标记为 (’ 0 ')。

因此,无论何时使用一个模式,预取请求只针对存储模式中对应位为“1”的块发出。图2为SMS的硬件实现。

2.1.1 example

让我们假设SMS跟踪大小为256字节的空间区域,缓存直接映射为512字节,而块大小为**64字节。**在本例中,缓存包含8个块,每个区域长4个块。

序号Region1序号Region2
04
167/58051346
26
320071490

在本例中,我们考虑以下内存访问顺序:67、200、580、1346、1490、1310开始时,缓存和预取器状态都是空的。地址67不在缓存中,映射到它的第二个块(上表的序号1)。此外,这是第一次进入一个新的空间区域。因此,它触发了SMS。SMS记录访问的PC(比如PC=0x001F54)和偏移量64,因为这个地址是空间区域的第二个块。第二个内存访问是地址200。这个地址也不在缓存中,并映射到它的第四个块(上表的序号3)。此外,地址200与地址67来自相同的空间区域,因此,偏移量192将被记录。

下一个内存访问是地址580。这个地址也不在缓存中,并映射到它的第二个块。因此,地址67将被替换为缓存中的这个地址。当一个活动空间区域的一个块在缓存中被替换时,表明该空间区域不再是活动的。因此,将记录{PC + Offset, Bit Pattern}(在本例中为{0x001F54+64,{0,1,0,1}})。地址580也开始一个新的空间区域。为简洁起见,我们不提及该空间区域的SMS记录。

下一个内存访问地址是1346。此地址不在缓存中,并映射到缓存的第六个块。这种访问也是一个新的空间区域的开始。为简洁起见,我们不提SMS是如何跟踪这个空间区域中的访问的。SMS还检查此访问是否匹配任何记录的**PC +偏移量。假设此内存访问来自与先前内存访问相同的加载指令。因此,pc是相同的。由于空间区域中的偏移量为64,因此偏移量也匹配。因此,SMS在新的空间区域中预取模式{0,1,0,1}(即只有块地址1472作为块地址1346的后续访问)。

下一个地址是1490。和前面一样,块地址1472是预取的,地址1490已经在缓存中,因此是命中。最后一个地址是1310,它来自与前一次内存访问相同的空间区域。

但是,这个地址不在缓存中,因为SMS先前用于预取的模式没有这个块,因此SMS没有预取这个缓存块,因此要将其加到PC+offset的访问模式中即为{1、1、1、0}。

2.2 VLDP(2015’Micro)

VLDP是一种最新的最先进的空间数据预取器,它依赖于内存空间区域之间delta模式的相似性。VLDP记录落入空间区域的连续访问之间的距离,并使用它们来预测未来的缺失。VLDP的关键创新是部署多个预测表来预测增量模式。 VLDP使用几个历史表,其中每个表根据输入历史的特定长度保存元数据。

VLDP的元数据组织如图3所示。三个主要组件是Delta历史缓冲区(DHB)、Delta预测表(DPT)和偏移预测表(OPT)。DHB是一个记录当前活动空间区域的增量历史的小表。DHB中的每个条目都与一个活动的空间区域相关联,并包含像最后引用块这样的详细信息。

这些详细信息用于索引OPT和DPT,以便发出预取请求。DPT是一组键值对,它将增量序列与下一个预期增量关联起来。VLDP受益于多个DPT,其中每个DPT以不同的输入长度记录历史。DPT-i将利用i个历史delta来预取下一个期望的序列。例如,如果一个空间区域的最后三个增量是d3, d2和d1 (d1是最近的增量),DPT-2存储<d3,d2> --d1,DPT1记录–d3。在查找dpt时,如果提供其中几个delta用于预测,则使用具有最长delta序列的表的预测,因为基于更长的输入进行的预测预计会更准确[1]。

通过这种方式,VLDP消除了由于短输入而产生的错误预测,从而提高了预取器的准确性和缺失覆盖率。

OPT是VLDP的另一个元数据表,它使用对空间区域的第一次访问的偏移量(而不是增量)进行索引。仅仅依靠增量进行预取要求预取器在发出预取请求之前至少观察到对空间区域的前两次访问;然而,有许多稀疏的空间区域,其中一些(例如两个)块被应用程序使用。因此,当应用程序在大量稀疏空间区域上操作时,在开始预取之前等待两次访问可能会使预取器失去发出足够的预取请求的机会。使用OPT可以使VLDP在第一次访问空间区域后立即开始预取。OPT将空间区域的第一次访问的偏移量与下一个期望的增量相关联。在第一次访问空间区域之后,使用访问的偏移量查找OPT,并使用表的输出发出预取请求。对于对空间区域的其余访问(即第二次访问),VLDP只使用dpt。

尽管VLDP依赖于具有单个下一个预取增量的预测表,但它仍然能够提供大于1的预取前瞻性,使用提出了多级预取机制。在多度模式下,在预测空间区域中的下一个delta后,VLDP将该预测作为dpt的输入,以进行更多的预测**(递归)**。

2.2.1 举例

与SMS的示例类似,让我们假设VLDP跟踪大小为256字节的空间区域,缓存直接映射为512字节大小,块大小为64字节。在本例中,缓存包含8个块,每个区域长4个块。

我们考虑与SMS相同的地址序列:67、200、580、1346、1490、1310开始时,缓存和预取器状态都是空的。地址67不在缓存中,映射到它的第二个块。此外,由于这是空间区域的第一个地址,因此在增量历史缓冲区(DHB)中没有与之相关的条目。因此,以下条目将被添加到DHB(请注意,偏移量和增量是以缓存块而不是字节为单位的)(表1)。

第二个内存访问是地址200。这个地址也不在缓存中,并映射到它的第四个块。此外,地址200和地址67来自同一个空间区域,因此DHB表项将被更新**(表2)。此外,由于这是对该空间区域的第二次访问,因此将在偏移量预测表(OPT)中添加一个条目(表3)**。
![](https://img-blog.csdnimg.cn/img_convert/7a5323897181ef46bd90a126dd67e0c1.png = 500x)
![](https://img-blog.csdnimg.cn/img_convert/4a06d3fcccadf75d990328b8051a24b7.png 500x)
下一个内存访问是地址580。这个地址也不在缓存中,并映射到它的第二个块。因此,地址67将被替换为缓存中的这个地址。由于这个地址来自不同的空间区域,因此将在DHB中为它创建一个条目(表4)。

此外,由于这是对空间区域的第一次访问,因此它有资格使用OPT进行预取。从空间区域开始的这次访问的偏移量是1,并且由于具有此偏移量的条目存在于OPT中,VLDP预取BlockAddress(580) + 2*BlockSize=576 + 128=704。

下一个内存访问是地址1347。此地址不在缓存中,并映射到缓存的第六个块。这个通道也是一个新的空间区域的开始。DHB的含量见表5。此外,由于这是对空间区域的第一次访问,因此它有资格使用OPT进行预取。这次访问与空间区域开始的偏移量为1。使用OPT, VLDP预取BlockAddress(1347) +2*BlockSize=1344 + 128=1472。

下一个地址是1490。和前面一样,块地址1472是预取的,地址1490已经在缓存中,因此是命中。1490命中后,DHB如表6所示。
他的最后一个地址是1310,来自同一个空间区域。但是,这个地址不在缓存中,因为VLDP没有预取它。表7显示了访问内存后DHB的内容。

此外,由于在DHB的一行中有多个增量,我们可以向增量预测表(DPT)添加条目。在这种情况下,由于只有两个delta,我们可以在DPT-1上添加“2==> -3”对于将来的内存访问,这个表项可以用于预取

2.3 总结

空间预取已经被提出并发展为捕捉内存页之间访问模式的相似性(例如,如果一个程序访问页X的位置{A,B,C,D},它很可能也访问其他页的位置{A,B,C,D})。空间预取之所以有效,是因为应用程序使用具有规则和固定布局的数据对象,并且在遍历数据结构时重新进行访问。空间预取很有吸引力,因为它给系统带来了较低的存储开销,为将来系统采用空间预取铺平了道路。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1014232.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vulnhub系列靶机-THM-ContainMe-v4

文章目录 Vulnhub系列靶机-THM-ContainMe-v41. 信息收集1.1 主机扫描1.2 端口扫描1.3 目录爆破 2. 漏洞探测3. 漏洞利用4. 权限提升 Vulnhub系列靶机-THM-ContainMe-v4 1. 信息收集 1.1 主机扫描 arp-scan -l1.2 端口扫描 nmap -A -p- 192.168.188.188端口扫描出来了&#…

Python 扩展后的赋值运算符

视频版教程 Python3零基础7天入门实战视频教程 以下&#xff0c;假设变量a为10&#xff0c;变量c为21&#xff1a; 实例代码&#xff1a; c a print("ca c", c)c - a print("c-a c", c)c * a print("c*a c", c)c / a print("c/a c"…

【Java基础夯实】枚举类回炉重造

&#x1f9d1;‍&#x1f4bb;作者名称&#xff1a;DaenCode &#x1f3a4;作者简介&#xff1a;啥技术都喜欢捣鼓捣鼓&#xff0c;喜欢分享技术、经验、生活。 &#x1f60e;人生感悟&#xff1a;尝尽人生百味&#xff0c;方知世间冷暖。 &#x1f4d6;所属专栏&#xff1a;Ja…

如何开发你的第一个Vue.js插件:完整指南

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

思科路由器:NAT的基础配置

一直以来&#xff0c;对于华为、H3C、锐捷交换机的命令配置&#xff0c;不断的有朋友留言&#xff0c;三家交换机的配置命令容易弄混&#xff0c;经常在实际项目配置中出错&#xff0c;因此&#xff0c;找几个基础的示例来练练。 R1配置 Router>en Router>enable Rout…

STM32单片机——串口通信(轮询+中断)

STM32单片机——串口通信&#xff08;轮询中断&#xff09; 串口通信相关概念HAL库解析及CubeMX工程配置与程序设计常用函数介绍CubeMX工程配置HAL库程序设计&#xff08;轮询中断&#xff09;轮询数据收发中断收发数据 固件库程序设计及实现固件库配置流程结构体配置及初始化程…

Python 基础知识结构

一、关键字 二、内置函数 三、运算符 1、算数运算符 加 数字与字符串拼接 - 减 * 乘 数字与字符串重复 / 除 返回浮点数 % 取模 返回除法的余数 奇偶判断 ** 幂次 // 整除 返回商的整数部分&#xff0c;向下取整数&#xff0c;注意&#xff1a;-10//3,出现负数时的情况只要参…

Java反序列化和php反序列化的区别

文章目录 PHP反序列化漏洞反序列化漏洞什么是反序列化漏洞&#xff1f;修改序列化后的数据&#xff0c;目的是什么&#xff1f; Java反序列化漏洞反序列化漏洞 PHP反序列化漏洞 序列化存在的意义是为了传输数据/对象&#xff0c;类是无法直接进行传输的。通过序列化后转换为字…

Middleware ❀ Hadoop功能与使用详解(HDFS+YARN)

文章目录 1、服务概述1.1 HDFS1.1.1 架构解析1.1.1.1 Block 数据块1.1.1.2 NameNode 名称节点1.1.1.3 Secondary NameNode 第二名称节点1.1.1.4 DataNode 数据节点1.1.1.5 Block Caching 块缓存1.1.1.6 HDFS Federation 联邦1.1.1.7 Rack Awareness 机架感知 1.1.2 读写操作与可…

C++深度优化——cacheline测试

cacheline是内存调度的基本结构&#xff0c;其大小一般为32B或者64B。关于本机具体的配置信息可以在配置文件中看到&#xff1a; 这里可以看到我的这台机器的cacheline大小是64B。对于cacheline在多核处理器中有一个伪共享的状态&#xff0c;具体可以参考以下博客&#xff1a;高…

正则表达式 - 语法

目录 正则表达式 - 语法 普通字符 测试工具 非打印字符 特殊字符 限定符 定位符 选择 以下列出 ?、?<、?!、? 反向引用 实例 实例 正则表达式 - 语法 正则表达式是一种用于匹配和操作文本的强大工具&#xff0c;它是由一系列字符和特殊字符组成的模式&#…

Python绘图系统19:添加时间轴以实现动态绘图

文章目录 时间轴单帧跳转源代码 Python绘图系统&#xff1a; &#x1f4c8;从0开始的3D绘图系统&#x1f4c9;一套3D坐标&#xff0c;多个函数&#x1f4ca;散点图、极坐标和子图自定义控件&#xff1a;绘图风格&#x1f4c9;风格控件&#x1f4ca;定制绘图风格坐标设置进阶&a…

深入理解Docker容器化技术:从入门到精通

&#x1f482; 个人网站:【工具大全】【游戏大全】【神级源码资源网】&#x1f91f; 前端学习课程&#xff1a;&#x1f449;【28个案例趣学前端】【400个JS面试题】&#x1f485; 寻找学习交流、摸鱼划水的小伙伴&#xff0c;请点击【摸鱼学习交流群】 Docker已经成为了现代应…

Windows开机密码破解

Windows11以及Windows10(21H2)以上版本 先开机&#xff0c;不进行任何操作&#xff0c;静静的等待登录界面 按住Shift重启 进入“选择一个选项”界面&#xff0c;点击疑难解答 点击高级选项 点击命令提示符 输入两行命令 copy C:\windows\system32\uti1man.exe C: \Window…

苹果电脑Mac系统运行速度又卡又慢是怎么回事?

通常大家处理Mac运行速度慢的方法不是重启就是清空废纸篓&#xff0c;但是这两种方法对于Mac提速性能的效果是微之甚微的&#xff0c;想要彻底解决Mac运行速度慢&#xff0c;你应该试试一下三种方法~ 1、清理磁盘空间 硬盘空间过少是Mac运行变慢很大的一个因素&#xff0c;各…

分享一个uniapp+springboot基于微信小程序的线上维修预约系统 在线维修小程序源码 lw 调试

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…

八股文学习三(jvm+线程池+锁)

1. jvm (1)概念 JVM是可运行 Java 代码的假想计算机 &#xff0c;包括一套字节码指令集、一组寄存器、一个栈、一个垃圾回收&#xff0c;堆 和 一个存储方法域。JVM 是运行在操作系统之上的&#xff0c;它与硬件没有直接的交互。 java运行过程&#xff1a; 我们都知道 Java…

ELK 企业级日志分析系统 ELFK

目录 一、概述 二、组件介绍 2.1、ElasticSearch 2.2、Kiabana 2.3、Logstash 2.4、可以添加的其它组件&#xff1a;Filebeat 2.5、缓存/消息队列&#xff08;redis、kafka、RabbitMQ等&#xff09; 2.6、Fluentd 三、ELK工作原理 四、实例演示 1.ELK之 部署"E&q…

【Git】万字git与gitHub

&#x1f384;欢迎来到边境矢梦的csdn博文&#x1f384; &#x1f384;本文主要梳理在git和GitHub时的笔记与感言 &#x1f384; &#x1f308;我是边境矢梦&#xff0c;一个正在为秋招和算法竞赛做准备的学生&#x1f308; &#x1f386;喜欢的朋友可以关注一下&#x1faf0;&…

接入日志收集平台前需恶补的必备知识

作者 观测云 产品服务部 技术经理 赵刚 一 前言 日志是系统中的重要数据来源之一&#xff0c;包含了丰富的信息&#xff0c;可以帮助我们更好地了解系统的运行状况和问题。本指南参照观测云文档&#xff08;https://docs.guance.com/&#xff0c;以下简称官网文档&#xff09…