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

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

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

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

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

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

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

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

优化十:利用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 的预测精度是完美的(即,以零成本知道所有未命中)。 

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

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

相关文章

跟我一起从零开始学python(一)编程语法必修

前言 随着互联网的高速发展,python市场越来越大,也越来越受欢迎,主要源于它:易学易用,通用性广,时代需要,源代码的开放以及人工智能浪潮,接来下我们就从这几个方向谈谈为何python越…

17 MFC进程通信

文章目录 剪切板管道匿名管道父进程写入数据子进程读出数据 命名管道 邮槽邮槽服务器邮槽客户端 剪切板 设置界面 发送 //设置剪切板数据 void CClipboardDlg::OnBnClickedBtnSend() {UpdateData(TRUE);if (m_strSend.IsEmpty()){MessageBox(L"请输入需要设置的文本&quo…

微信小程序如何进行开发?

文章目录 0.引言1.注册微信公众平台账号2.准备微信开发者工具3.创建微信小程序并预览 0.引言 笔者编程一般编得较多的是桌面软件,有时也会编手机软件,这些软件都必须安装才能使用,这限制了软件的推广。而现有社交软件如微信使用得较广泛&…

Linux的编译器——gcc/g++(预处理、编译、汇编、链接)

文章目录 一.程序实现的两个环境二.gcc如何完成1.预处理2.编译3.汇编4.链接 三.动态库与静态库对比下二者生成的文件大小 四.gcc常用选项 前言: 本文主要认识与学习Linux环境下常用的编译器——gcc(编译C代码)/g(编译C代码&#x…

深度学习--神经网络全面知识点总结(持续更新中)

文章目录 神经网络基础1.1 什么是神经网络?1.2 神经元和激活函数1.3 前向传播和反向传播1.4 损失函数和优化算法 深度神经网络2.1 卷积神经网络(CNN)2.2 循环神经网络(RNN)2.3 长短期记忆网络(LSTM&#xf…

凝思系统docker离线安装

# linux离线安装docker (18.03.1-ce) ## 解压,得到docker文件夹 tar xzvf docker-18.03.1-ce.tgz ## 将docker文件夹里面的所有内容复制到/usr/bin目录 sudo cp docker/* /usr/bin/ ## 开启docker守护进程 sudo dockerd & 当终端中显示【API list…

Mathtype7Mac苹果ios简体中文版

对于很多人来说,每次编辑文字的时候遇到公式简直就是噩梦。像那些复杂的数学、物理还有化学公式,太难编辑出来了。 那么我们该怎么解决这些难题呢?其实很简单,用公式编辑器就行了。 公式编辑器,是一种工具软件&#…

网络安全之反序列化漏洞分析

简介 FastJson 是 alibaba 的一款开源 JSON 解析库,可用于将 Java 对象转换为其 JSON 表示形式,也可以用于将 JSON 字符串转换为等效的 Java 对象分别通过toJSONString和parseObject/parse来实现序列化和反序列化。 使用 对于序列化的方法toJSONStrin…

卷积神经网络| 猫狗系列【AlexNet】

首先,搭建网络: AlexNet神经网络原理图: net代码:【根据网络图来搭建网络,不会的看看相关视频会好理解一些】 import torchfrom torch import nnimport torch.nn.functional as Fclass MyAlexNet(nn.Module): def…

Flutter学习四:Flutter开发基础(六)调试Flutter应用

目录 0 引言 1 Flutter异常捕获 1.1 Dart单线程模型 1.2 Flutter异常捕获 1.2.1 Flutter框架异常捕获 1.2.1.1 Flutter默认异常捕获方式 1.2.1.2 自己捕获异常并上报 1.2.2 其他异常捕获与日志收集 1.2.3 最终的错误上报代码 0 引言 本文是对第二版序 | 《Flutter实…

《Lua程序设计》--学习2

表 Lua语言中的表本质上是一种辅助数组(associative array),这种数组不仅可以使用数值作为索引,也可以使用字符串或其他任意类型的值作为索引(nil除外)。 Lua语言中的表要么是值要么是变量,它…

防火墙基本原理详解

概要 防火墙是可信和不可信网络之间的一道屏障,通常用在LAN和WAN之间。它通常放置在转发路径中,目的是让所有数据包都必须由防火墙检查,然后根据策略来决定是丢弃或允许这些数据包通过。例如: 如上图,LAN有一台主机和一…

【macOS 系列】如何在mac 邮件客户端配置QQ邮箱和第二个账号

文章目录 一、配置QQ邮箱二、添加新的账户 一、配置QQ邮箱 需要在QQ邮箱账户设置中开启: 开启时,会让你发短信到指定号码,然后就会弹出一个验证码 也就是添加邮箱的密码不是QQ密码,而是这个验证码,这个可以生成多个&…

【OpenGL】读取视频并渲染

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍读取视频并渲染。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新不迷路&#…

ELK实验部署过程

ELK集群部署环境准备 配置ELK日志分析系统 192.168.1.51 elk-node1 es、logstash、kibana 192.168.1.52 elk-node2 es、logstash 192.168.1.53 apache logstash (我这里是把虚拟机的配置全部都改为2核3G的) 2台linux 第1台:elk-nod…

【数据库原理】MyShop 商城数据库设计(SQL server)

MyShop 商城数据库设计 项目背景定义课程设计要求概念结构设计逻辑结构设计数据结构的描述用户信息数据结构的描述地址信息数据结构的描述商品类别数据结构的描述商品数据结构的描述购物车数据结构的描述订单数据结构的描述订单项数据结构的描述 物理结构设计用户表结构地址表结…

STM32——GPIO配置

文章目录 一、GPIO八种模式1. 输入2. 输出3. 如何选择GPIO的模式 二、库函数GPIO配置1. 配置代码2.参数设置 一、GPIO八种模式 GPIO的输入输出是对于STM32单片机来说的。以下仅为个人粗略笔记,内部电路分析可参考博客https://blog.csdn.net/k666499436/article/det…

计算机网络_ 1.3 网络核心(数据交换_电路交换_多路复用)

计算机网络_数据交换_电路交换_多路复用 多路复用频分多路复用FDM时分多路复用TDM波分多路复用WDM码分多路复用CDM 多路复用 多路复用(Multiplexing),简称复用,是通信技术的基本概念。 链路/网络资源(如带宽&#x…

【K8S系列】如何高效查看 k8s日志

序言 你只管努力,其他交给时间,时间会证明一切。 文章标记颜色说明: 黄色:重要标题红色:用来标记结论绿色:用来标记一级论点蓝色:用来标记二级论点 Kubernetes (k8s) 是一个容器编排平台&#x…

docker安装失败 应用程序无法启动,因为应用程序的并行配置不正确

问题描述 报错“应用程序无法启动,因为应用程序的并行配置不正确”。 配置:windows10 解决过程 网上的解决方案有三种: 启动windows服务Windows Modules Installer。运行sxstrace.exe。安装visual c相关依赖。下载visual studio installer…