计算机体系结构基础知识介绍之缓存性能的十大进阶优化之非阻塞缓存(四)

优化四:非阻塞缓存,提高缓存带宽

对于允许乱序执行的流水线计算机,处理器不需要因数据高速缓存未命中而停止。 例如,处理器可以继续从指令高速缓存获取指令,同时等待数据高速缓存返回丢失的数据。 非阻塞高速缓存或无锁高速缓存允许数据高速缓存在未命中期间继续提供高速缓存命中,从而增强了这种方案的潜在优势。 这种“未命中下的命中”优化通过在未命中期间提供帮助而不是忽略处理器的请求来减少有效的未命中损失。 一个微妙而复杂的选项是,如果缓存可以重叠多个未命中,则可以进一步降低有效未命中惩罚:“多次未命中下的命中”或“未命中下的未命中”优化。 仅当内存系统可以处理多次未命中时,第二个选项才有用。 大多数高性能处理器(例如英特尔酷睿处理器)通常都支持两者,而许多低端处理器仅在 L2 中提供有限的非阻塞支持。

简单来说,非阻塞缓存是一种数据缓存,它可以在处理一个缓存不命中的请求时,继续响应其他缓存命中的请求,从而减少处理器的等待时间。

非阻塞缓存有以下几种优化方式:

  • 命中在不命中下(hit under miss):一种非阻塞缓存优化方式,它允许在处理一个缓存不命中的请求时,同时响应一个缓存命中的请求。
  • 命中在多重不命中下(hit under multiple miss)或不命中在不命中下(miss under miss):一种非阻塞缓存优化方式,它允许在处理多个缓存不命中的请求时,同时响应多个缓存命中或不命中的请求。这种方式需要内存系统能够同时服务多个不命中的请求。

 

  • Farkas和Jouppi (1994) 的研究:他们假设了一个8 KiB的单层次缓存和一个14周期的不命中惩罚,并观察了允许一个命中在不命中下优化时,对于SPECINT92和SPECFP92基准测试程序的有效不命中惩罚(effective miss penalty)的减少情况。他们发现对于SPECINT92程序平均减少了20%,对于SPECFP92程序平均减少了30%。
  • Li等人 (2011) 的研究:他们更新了前一项研究,使用了一个多层次缓存、更现代化的不命中惩罚假设和更大更具挑战性的SPECCPU2006基准测试程序。他们的研究基于一个类似于Intel i7的单核处理器模型。图显示了允许1、2和64个命中在不命中下优化时,数据缓存访问延迟的减少情况。他们发现由于缓存变大和增加了三级缓存,非阻塞缓存的效果有所降低,对于SPECINT2006程序平均减少了约9%,对于SPECFP2006程序平均减少了约12.5%。

 

评估非阻塞缓存性能的难点是,缓存不命中并不一定会导致处理器停顿。在这种情况下,很难判断任何一个不命中的影响,从而计算平均内存访问时间。有效的不命中惩罚并不是所有不命中的时间之和,而是处理器停顿的不重叠的时间。非阻塞缓存的效益是复杂的,它取决于以下几个因素:

  • 当有多个不命中时,不命中惩罚的大小,这决定了处理器能否在等待数据时继续执行其他指令。
  • 内存引用模式,这决定了处理器在一个不命中期间需要访问多少其他数据。
  • 处理器能够同时处理多少个不命中的请求,这决定了非阻塞缓存能够提供多少优化方式。

一般来说,乱序执行的处理器能够隐藏大部分一级数据缓存不命中但在二级缓存命中的惩罚,但是不能隐藏很大一部分低层次缓存不命中的惩罚。决定支持多少个未完成的不命中请求取决于以下几个因素:

  • 不命中流中的时间和空间局部性,这决定了一个不命中是否可以启动一个新的访问到低层次缓存或内存。
  • 响应内存或缓存的带宽,这决定了一个不命中需要等待多长时间才能得到数据。
  • 要允许在最低层次缓存有更多的未完成的不命中请求(因为这里的不命中时间最长),就需要在高层次缓存至少支持同样多的不命中请求,因为一个不命中必须从最高层次缓存开始。
  • 内存系统的延迟,这决定了一个不命中需要等待多长时间才能得到响应。

实现非阻塞缓存有以下两个主要的问题:

  • 如何在命中和不命中之间进行仲裁,解决冲突。在一个阻塞缓存中,不命中会导致处理器停顿,不会有更多的访问发生,直到不命中处理完毕。在一个非阻塞缓存中,命中可能与从下一级存储器返回的不命中发生碰撞。如果允许多个未完成的不命中,这种碰撞就更有可能发生。这些碰撞必须被解决,通常的方法是先给予命中优先于不命中,其次是对碰撞的不命中进行排序(如果可能的话)。
  • 如何跟踪未完成的不命中,知道何时可以让加载或存储继续执行。在一个阻塞缓存中,我们总是知道哪个不命中正在返回,因为只有一个可以未完成。在一个非阻塞缓存中,这种情况很少成立。考虑一下在一级缓存发生的一个不命中。它可能在二级缓存产生一个命中或不命中;如果二级缓存也是非阻塞的,那么返回到一级缓存的不命中的顺序就不一定和它们最初发生的顺序相同。多核和其他多处理器系统由于有非均匀缓存访问时间也会引入这种复杂性。当一个不命中返回时,处理器必须知道哪个加载或存储导致了这个不命中,以便这条指令可以继续执行;并且必须知道数据应该放在缓存的哪个位置(以及这个块的标记位的设置)。

在非阻塞高速缓存中,命中可能与从内存层次结构的下一级返回的未命中发生冲突。如果我们允许多个未完成的未命中,则未命中甚至有可能发生冲突。

为什么?

因为非阻塞缓存需要在有限的缓存空间和带宽内处理多个请求,而这些请求可能访问相同或相邻的缓存块。例如:

  • 如果一个命中请求和一个未命中请求访问同一个缓存块,那么它们就会发生冲突,因为它们需要同时读写这个块。通常的解决方法是让命中请求优先于未命中请求,以减少处理器的等待时间。
  • 如果一个未命中请求和另一个未命中请求访问同一个缓存组(set),那么它们就会发生冲突,因为它们需要同时占用这个组的一个空闲位置。通常的解决方法是对未命中请求进行排序,以保证一定的顺序和公平性。
  • 如果多个未命中请求返回的数据量超过了缓存到处理器的总线带宽,那么它们就会发生冲突,因为它们需要同时传输数据给处理器。通常的解决方法是增加总线带宽或使用压缩技术,以减少数据量。

非阻塞缓存需要额外的逻辑,因此在能量上有一些代价。然而,很难准确地评估它们的能量消耗,因为它们可能减少停顿时间,从而降低执行时间和能量消耗。除了上述问题之外,多处理器内存系统(无论是在单个芯片上还是多个芯片上)还必须处理与内存一致性和一致性相关的复杂实现问题。而且由于缓存不命中不再是原子性的(因为请求和响应被分开并且可能被多个请求交错),还有死锁的可能性。

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MYSQL的基本数据类型和建库

1.创建数据库,删除数据库,查询创建数据的语句,使用数据库,查询当前默认的数据库以及使用的编码方式校验规则 2.数字,文本,日期 在一章表中定义多个字段,要使用今天提到的所有的数据类型 1创建数…

为了实现上网自由,我做了一个多功能串口服务器

项目作者:小华的物联网嵌入式之旅 介绍:从事电气自动化行业,多次获得物联网设计竞赛,爱好嵌入式设计开发,物联网开发。 设计方案思路的由来,是因为我们现在的开发板基本需要通过串口与WIFI模组或以太网模…

图片框架Glide学习总结及插件实现

一.前言 图片加载框架个人选择的是Glide,该框架非常优秀,其知识体系很庞大,个人就对Glide部分知识的学习做一下总结,同时对框架的使用做一下封装,做成插件。 二.知识主干 知识主干如下,每一部分的知识会…

Network Neuroscience:整个生命周期的功能连接体指纹

导读 随着年龄的增长,人脑功能结构发生了系统性的变化。然而,功能连接(FC)作为一种检测独特“连接体指纹”的强大特征,使个体能够在同龄人中被识别出来。虽然已在年轻人样本中观察到这种指纹,但该方法在整个生命周期内的可靠性尚…

实现【Linux--NTP 时间同步服务搭建】

实现【Linux--NTP 时间同步服务搭建】 🔻 前言🔻 一、NTP 校时🔰 1.1 NTP 服务校时与 ntpdate 校时的区别🔰 1.2 NTP 校时服务搭建🔰 1.2.1 确认 ntp 的安装🔰 1.2.2 配置 ntp 服务🔰 1.2.3 启动…

QNAP威联通NAS搭建SFTP服务,并内网穿透实现公网远程访问

文章目录 前言1. 威联通NAS启用SFTP2. 测试局域网访问3. 内网穿透3.1 威联通安装cpolar内网穿透3.2 创建隧道3.3 测试公网远程访问 4. 配置固定公网TCP端口地址4.1 保留一个固定TCP端口地址4.2 配置固定TCP端口地址4.3 测试使用固定TCP端口地址远程连接威联通SFTP 转载自远程内…

优化|一阶方法:求解不具有凸性和lipschitz连续性的复合问题

论文解读者:陈康明,赵田田,李朋 编者按:​ 对于大多数一阶算法,我们会在收敛性分析时假设函数是凸的,且梯度满足全局 Lipschitz 条件。而本文中,对于某一类特殊函数。我们不仅不要求函数是凸的…

一次源码编译安装PostgreSql失败

需要perl;之前博文已提到;之前有一种编程语言叫perl,此perl应该不是那个;可到其官网下载,Perl Download - www.perl.org 安装时添加到环境变量; 可能是一个东西;有编程语言和工具;大…

html实现多种风格的时间轴(附源码)

文章目录 1.设计来源1.1 对称风格时间轴1.2 横向风格时间轴1.3 回忆风格时间轴1.4 记事风格时间轴1.5 简易风格时间轴1.6 科技风格时间轴1.7 列表风格时间轴1.8 跑道风格时间轴1.9 人物风格时间轴1.10 容器风格时间轴1.11 沙滩风格时间轴1.12 双边风格时间轴1.13 图文风格时间轴…

CRM系统中AI如何进行销售线索评分?有什么好处(上)

每个公司的TOP销售都是精明的猎手。他们善于从大量潜在客户中挑出最可能购买的,把最好的时间、精力和资源给到高意向客户。意向度差一些的排在后面,在资源分配上也会降低。现在,您可以通过AI来进行线索评分,可以说CRM销售线索评分…

【Linux】 Linus世界,WIndows VS Linux

文章目录 前言WindowsLinux操作系统Windows VS Linux收费情况技术支持安全性开源 区别 前言 在电脑世界有两种十分常见的电脑操作系统——Linux与和Windows,相信对电脑有一定了解的人对它们一定并不陌生!但是在我们的使用过程中,是否有什么事…

MySQL用户管理

目录 用户管理 用户 用户信息 创建用户 删除用户 修改用户密码 数据库的权限 给用户授权 回收权限 用户管理 如果我们只能使用root用户,这样存在安全隐患。这时,就需要使用MySQL的用户管理。 用户 用户信息 MySQL中的用户,都存储…

3 springboot更改tomcat的端口和启动时的banner

3.1 更改tomcat端口 点击resources下的application.properties。 然后,添加以下信息,即可把端口号更改为8081。 # 更改项目的端口号 server.port80813.2 更改启动时的banner 首先,进入网站:https://www.bootschool.net/ascii-art…

STL源码刨析 string实现

目录 一. string 类介绍 二. string 的简单实现 1. 类内成员变量 2. Member functions string ~string operator string(const string& str) 3. Capacity size capacity empty clear reserve resize 4.Modifiers push_back append operator insert era…

微服务:Springboot集成Hystrix实现熔断、降级、隔离

文章目录 前言知识积累Springboot集成Hystrix1、maven依赖引入2、application开启feign的hystrix支持(客户端配置限流降级熔断)3、入口类增加EnableFeignClients EnableHystrix 开启feign与hystrix4、feign调用增加降级方法服务端配置限流降级熔断(选择使…

MySQL基础篇第1章(数据库概述)

文章目录 1、为什么要使用数据库2、数据库与数据库管理系统2.1 数据库的相关概念2.2 数据库与数据库管理系统的关系2.3 常见的数据库管理系统排名2.4 常见的数据库介绍 3、MySQL介绍3.1 概述3.2 MySQL发展史重大事件3.3 关于MySQL 8.03.4 Oracle VS MySQL 4、RDBMS 与 非RDBMS4…

基于Python热门旅游景点数据分析系统设计与实现

博主介绍: ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ 🍅 文末获取源码联系 🍅 👇🏻 精彩专…

管理执行系统-亿发MES智能制造系统赋能制造企业信息化,实现工业现代化

在制造技术领域,质量控制信息集成建设需要健全的管理体系,加强全过程管理。虽然管理执行系统 (MES) 背后的理论思维已经取得了重大进展,但在软件应用集成和分析能力方面仍有改进的空间。本文将探讨MES系统如何赋能制造企业信息化,…

Camera API1 使用说明

Camera API2 使用说明 目录 一、开启相机 1.1创建项目 1.2注册权限 1.3配置相机特性要求 1.4 获取摄像头的个数 1.5 根据 ID 获取 CameraInfo facing 1.6 开启相机 1.7 关闭相机 二、预览 2.1认识 Parameters 2.2 设置预览尺寸 2.3添加预览 Surface 2.4 开启和关…

指针的进阶(1)

指针的回顾 在C语言中,指针是一个变量,与其他数据不同的是,它的作用是用来存储其它变量的内存地址。指针可以指向不同类型的数据,包括整数、浮点数 、字符、数组等。通过使用指针,我们可以直接访问和修改存储在内存中…