计算机体系结构基础知识介绍之缓存性能的十大进阶优化之编译器控制的预取和利用HBM扩展内存层次(七)

news2024/10/6 20:38:04

优化九:编译器控制的预取以减少丢失惩罚或丢失率

硬件预取的替代方案是编译器在处理器需要数据之前插入预取指令来请求数据。

预取有两种类型:
■ 寄存器预取将值加载到寄存器中。
■ 高速缓存预取仅将数据加载到高速缓存。

这两种类型都可以分为有错或无错的,即预取的地址是否会导致虚拟地址错误或保护错误的异常。使用这个术语,一个普通的加载指令可以被认为是一个“有错的寄存器预取指令”。无错的预取指令如果遇到异常,就会变成空操作。

最有效的预取是“对程序语义不可见”的:它不改变寄存器和内存的内容,也不会引起虚拟内存错误。现在大多数处理器都提供无错的缓存预取指令。这一节假设使用无错的缓存预取,也叫非绑定预取。

预取技术只有在处理器可以在预取数据的同时继续执行时才有意义;也就是说,缓存不会停顿,而是在等待预取数据返回的同时继续提供指令和数据。这样的计算机的数据缓存通常是非阻塞的。和硬件控制的预取一样,目标是让执行和预取数据重叠。

循环是重要的目标,因为它们适合于预取优化。如果不命中代价很小,编译器只需要展开循环一次或两次,并将预取和执行调度起来。如果不命中代价很大,它就使用软件流水或者展开很多次来预取未来迭代的数据。发出预取指令会产生指令开销,所以编译器必须小心确保这种开销不会超过收益。通过专注于可能是缓存不命中的引用,程序可以避免不必要的预取,同时显著提高平均内存访问时间。

优化十:利用HBM扩展内存层次

HBM是High Bandwidth Memory的缩写,是一种高速的计算机内存接口,用于三维堆叠的同步动态随机存取存储器(SDRAM)。HBM的特点是将多个DRAM芯片通过硅通孔(TSV)技术垂直堆叠在一起,并与处理器封装在同一个芯片内,实现了高容量、高带宽、低功耗和低延迟的内存方案。

 由于大多数通用服务器处理器需要的内存容量超过了HBM封装技术能够提供的范围,所以有人提出了将封装在处理器内部的DRAM用作大容量的L4缓存,这些缓存的容量可以达到128 MiB到1 GiB甚至更多,远远超过了当前片上L3缓存的容量。使用这样大的基于DRAM的缓存会引起一个问题:标记(tag)应该放在哪里?这取决于标记的数量。假设我们使用64B的块大小,那么一个1 GiB的L4缓存需要96 MiB的标记,这比CPU上的缓存中存在的静态内存还要多。将块大小增加到4 KiB,可以显著减少标记存储,只需要256 K个条目或者不到1 MiB的总存储空间,这可能是可以接受的,考虑到下一代多核处理器中L3缓存的容量为4~16 MiB或者更多。

然而,这样大的块大小有两个主要问题。第一,缓存可能会被低效地使用,当许多块中的内容不需要时;这被称为碎片化问题,它也出现在虚拟内存系统中。此外,传输这样大的块如果大部分数据没有被使用也是低效的。第二,由于块大小很大,缓存中能够保存的不同块的数量就很低,这可能导致更多的不命中,特别是冲突和一致性不命中。解决第一个问题的一个部分解决方案是添加子块(subblock)。子块允许块中的部分数据是无效的,需要在不命中时才获取它们。子块技术,然而,并不能解决第二个问题。

标记存储是使用较小块大小的主要障碍。一个可能的解决方案是将L4缓存的标记存储在HBM中。乍一看这似乎是行不通的,因为每次访问L4缓存都需要两次访问DRAM:一次是为了标记,另一次是为了数据本身。由于随机访问DRAM所需的时间很长,通常是100个或更多处理器时钟周期,所以这种方法被放弃了。Loh和Hill(2011)提出了一个巧妙的解决方案:将标记和数据放在HBM SDRAM中的同一行中。虽然打开行(最终关闭它)需要很长时间,但是访问行中不同部分所需的CAS延迟只有新行访问时间的三分之一左右。因此我们可以先访问块中的标记部分,如果命中了,那么再使用列访问来选择正确的字。Loh和Hill(L-H)提出了一种组织L4 HBM缓存的方法,使得每个SDRAM行由一组标记(在块头部)和29个数据段组成,构成一个29路组相联缓存。当访问L4时,打开适当的行并读取标记;如果命中,则再进行一次列访问以获取匹配数据。

Qureshi和Loh(2012)提出了一种改进方法,称为合金缓存(alloy cache),可以减少命中时间。合金缓存将标记和数据融合在一起,并使用直接映射的缓存结构。这样可以将L4访问时间减少到一个HBM周期,通过直接索引HBM缓存并进行标记和数据的突发传输。

合金缓存相比L-H方案,将命中时间减少了超过两倍,但是以增加不命中率1.1~1.2倍为代价。在这两种方案中,不命中都需要两次完整的DRAM访问:一次是为了获取初始标记,另一次是为了访问主存(这甚至更慢)。如果我们能够加快不命中检测,我们就能够减少不命中时间。有两种不同的解决方案来解决这个问题:一种是使用一个映射来跟踪缓存中的块(不是块的位置,只是是否存在);另一种是使用一个内存访问预测器,使用历史预测技术来预测可能的不命中,类似于用于全局分支预测的技术。

 

运行 LH 方案、SRAM 标签方案和理想 L4(理想)的 SPECrate 基准测试时的性能加速; 加速 1 表示 L4 缓存没有任何改进,如果 L4 完美并且不占用访问时间,则可以实现 2 的加速。 使用 10 个内存密集型基准测试,每个基准测试运行八次。 使用随附的未命中预测方案。 理想情况假设仅需要访问和传输 L4 中请求的 64 字节块,并且 L4 的预测精度是完美的(即,以零成本知道所有未命中)。 

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

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

相关文章

k8s对象操作的了解

一:什么是Kubernetes对象 Kubernetes对象指的是Kubernetes系统的持久化实体,所有这些对象合起来,代表了你集群的实际情况。常规的应用里,我们把应用程序的数据存储在数据库中,Kubernetes将其数据以Kubernetes对象的形…

unity+pico neo3入门教程

安装unity,教程如下:unity2021安装教程 安装pico的SDK:: https://developer-cn.pico-interactive.com/ 有入门教程:导入 SDK - PICO 开发者平台 注册后组织,创建应用learntest,如下 下载SDK。下载最新版&#xff…

旧固态硬盘复制到新固态硬盘多出一个分区怎么办?

朋友电脑只有512G而且只有一个硬盘口,然后就买了一款1T硬盘,去店里回来之后发现多出一个分区,无法直接在系统里合并 这时候我们就需要下载第三方软件,删除多余分区,扩展C盘 软件下载链接: DiskGenius.rar…

Stable Diffusion 用插件管理NNN个模型

当初步涉足 Stable Diffusion,可能会被各种新概念和模型搞得头大。好比我们作为新晋的魔法师,需要理解如何巧妙使用各种法师装备——也就是这些模型,以更好地应对问题,发挥出最大效果。 要了解一个被称为 safetensors 的概念。这…

TRACE请求造成XSS

漏洞描述 远端WWW服务支持TRACE请求。RFC 2616介绍了TRACE请求,该请求典型地用于测试HTTP协议实现。 漏洞危害 攻击者利用TRACE请求,结合其它浏览器端漏洞,有可能进行跨站脚本攻击,获取敏感信息,比如cookie中的认证信…

如何用思维导图规划旅行

又到了一年一度的旅游旺季,旅游是一件令人愉悦又放松的事情。合理的规划旅游不仅可以保证旅行的顺利进行。还可以帮助我们提前了解旅游地的信息,比如当地的民俗、文化、天气等等。特别的正值旅游旺季的时候,一份合理的规划,可以帮…

【IMX6ULL - LOGO替换】uboot阶段替换打印的开发板Logo教程

替换Board: I.MX6U VSTC,将其显示为Board: I.MX6U ALIENTEK (1)修改 uboot/board/freescale/mx6ullevk 路径下的 mx6ullevk.c 文件内容: int checkboard(void) {if (is_mx6ull_9x9_evk())puts(

ARM_串口解析器

include/serial.h #ifndef __UART4_H__ #define __UART4_H__#include "stm32mp1xx_rcc.h" #include "stm32mp1xx_gpio.h" #include "stm32mp1xx_uart.h"//引脚封装 #define GPIO_PIN_0 0 #define GPIO_PIN_1 1 #define GPIO_PIN_2 2 #define GP…

当你知道前后端分离与不分离的6个特点,你就不该再当点工了!

前后端不分离 在早期,Web 应用开发主要采用前后端不分离的方式,它是以后端直接渲染模板完成响应为主的一种开发模式。以前后端不分离方式开发的 Web 应用的架构图如下: 浏览器向服务器发起请求,服务器接收到请求后去数据库中获取…

大数据之数据采集项目延伸——sqoop

承接上篇文章 大数据之数据采集项目总结——hadoop,hive,openresty,frcp,nginx,flume https://blog.csdn.net/qq_43759478/article/details/131520375?spm1001.2014.3001.5501 在上个阶段:完成了数据收集&…

查找满足条件的文件

linux 系统下查询当前多个子目录下满足条件的文件 find ./ -mindepth 2 -name *.png

attention中为啥multi-head输出结果进行concat,得到x,x还要乘上一个WO矩阵?

刚刚在敲vit模型代码,突然一个疑问,就是multi-head输出结果进行concat,得到x,x的维度是预期维度,然后再乘以一个WO矩阵,为啥要乘上一个WO矩阵,x的维度已经是预期的了??&a…

C#基础学习_类的方法

C#基础学习_类的方法 概念:描述对象的动态特征 类型:实例方法、静态方法等 方法的定义: 访问修饰符(默认为private) 返回值类型 方法名(类型 参数1,类型 参数2,...) {//这里编写方法的主体(功能实现的具体过程)return 返回值; //若没有返回值,则不需要写该语句 }

2023年第四届“华数杯”全国大学生数学建模竞赛(附历年赛题和论文)

目录 华数杯简介大赛资料获取方式 华数杯简介 国赛前的预热”华数杯“第四届正在报名中,看到咨询我们的同学不少,挺多同学都非常感兴趣,但是又不清楚比赛的相关情况,这里将会给同学们一一答疑。 比赛难度:难度适中&am…

【面试常见】JS继承与原型、原型链

前后端面试题库 (面试必备) 推荐:★★★★★ 地址:前端面试题库 web前端面试题库 VS java后端面试题库大全 在 JavaScript 中,继承是实现代码复用和构建对象关系的重要概念。本文将讨论原型链继承、构造函数继承以及…

QML Canvas 制作动画

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 终于要介绍动画了,这意味着我们快要把 Canvas 学完了,所以是时候庆祝一下了… 要在 Canvas 上实现动画,需要间隔一定的时间重绘动画的下一帧,而且频率要足够快,这样才能在图像切换时看起来像动画一样。…

一篇文章让你搞懂字符指针,数组指针,指针数组,数组传参和指针传参,函数指针

回顾 首先我们来大概回顾一下指针初阶的知识 内存会划分为一个个的内存单元,每个内存单元都有一个独立的编号—编号也被称为地址,地址在C语言中也被称为指针,指针(地址)需要存储起来—存储到变量中,这个变…

【Redis】缓存穿透、缓存击穿、缓存雪崩的原因及解决方案

文章目录 一、缓存穿透1.1 产生原因1.2 解决方法接口校验对空值进行缓存使用布隆过滤器实时监控 二、缓存雪崩2.2 解决方法将失效时间分散开给业务添加多级缓存构建缓存高可用集群使用锁或者队列的方式设置缓存标记 三、缓存击穿3.2 解决方法使用互斥锁”提前“使用互斥锁 / 逻…

QT开发技巧之QTableWidget设置表头颜色字体

1.默认的表头和内容背景字体一样不好区别,可以通过qss设置修改表头样式 2.修改后效果如下 qss代码: /*表格头背景色*/ QHeaderView::section { background: rgb(128, 255, 255); font-family: "宋体"; font-weight:bold; font-size:16px; }

网站弱口令爆破小脚本

介绍 weakpass_exploit,网站弱口令爆破小脚本 优点: 绕过图形验证码 绕过前端数据加密 不足: ddddocr识别不够精确 单线程 注: 本项目所有文件仅供学习和研究使用,请勿使用项目中的技术源码用于非法用途,任何人造成的任何负面影响,与…