第3章 CPU微架构

3.1 指令集架构

指令集ISA是软件用来与硬件通信的词汇集合,定义了软件和硬件之间的通信协议。Intel x86、ARM v8、RISC-V是当今广泛使用指令集架构的实例。ISA开发者通常要确保符合规范的软件或固件能在使用该规范构建的任何处理器上执行。广泛部署的ISA组织通常还要保证向后兼容性以便第X代版本处理器编写的代码能够继续在第X+i代上运行。

除了提供标量访存、标量计算和控制指令之外,广泛部署的架构还在继续增强其ISA以支持新的计算范式,包括增强的向量处理指令和矩阵/张量指令。

随着深度学习领域的快速发展,业界对其他数字格式变量驱动的显著性能提升重新产生了兴趣。研究表明,在使用更少的位来表示变量、节省算力和内存带宽方面,深度学习模型表现同样出色。

3.2 流水线

流水线是加快CPU速度的基础技术,其中多条指令在执行过程中可以重叠。简单5段流水线:取指、译码、执行、访存、写回。(寄存器重命名、发射、去操作数、提交)

很多现代CPU都是深度流水线化的。流水线的吞吐量定义为单位时间内完成和退出流水线的指令数。任何给定指令的延迟是指经过流水线所有阶段的总时间。将指令从一个阶段移动到另一个阶段所需的时间定义为CPU的基本时钟周期或时钟。流水线运行的时钟周期数通常由流水线最慢的阶段决定。理想流水线中每条指令的执行时间由下式给出:
        流水化中每条指令的执行时间=非流水情况/流水阶段数

实际实现中的流水线会引入几个约束:结构冒险、数据冒险和控制冒险。幸运的是,程序员不需要应对流水线冒险,在现代CPU中所有类别的冒险都是由硬件控制的。

结构冒险由资源冲突引起,可以通过复制硬件资源(多端口寄存器)来消除,代价是硅面积和功耗方面的成本会很高昂。

数据冒险中WAW和WAR可以通过寄存器重命名来避免,RAW可以通过旁路网络来减轻损失。

控制冒险由程序执行流程的变化而导致的。它们产生于流水线分支指令和其他更改程序流程的指令。决定分支方向的分支条件在流水线的EXE阶段才能见分晓。因此,除非消除控制冒险,否则下一条指令的获取不能被流水线化。不过可以用动态分支预测和投机执行来克服该冒险。

3.3 利用指令级并行

因为程序中大多数指令是独立的,所以都适合流水线化和并行执行。

3.3.1 乱序执行

乱序执行主要用于避免因为依赖而引起的流水线停顿。指令的动态调度是通过复杂的硬件结构(记分板)和诸如寄存器重命名之类的技术实现的。记分板的大小决定了硬件在调度此类独立指令时可以提前多长时间进行。

3.3.2 超标量引擎和超长指令字

目前CPU的典型发射宽度为2~6。为了保证恰当的平衡,这种超标量引擎还支持多个执行单元和流水线执行单元。CPU的多发射功能与深度流水线和乱序执行功能相结合,以获取软件给定片段的最大ILP。

Intel Itanium等架构使用VLIW,将调度超标量和多执行单元处理器的负担从硬件转移到编译器。基本原理在于要求编译器选择正确的指令组合使得机器被充分利用,从而简化硬件。因为硬件受制于指令窗口长度的限制,而编译器可以获取全局信息。

3.3.3 投机执行

如果指令在分支条件得到确定之前停顿,控制冒险可能会导致流水线中显著的性能损失。硬件分支预测逻辑是一种避免这种性能损失的技术。

在条件结果得以明确之前,无法提交对机器状态的修改,以确保机器的架构状态永远不受投机执行指令的影响。当预测错误时,投机执行的结果必须被制止和丢弃,即分支预测错误惩罚。

3.4 利用线程级并行

硬件多线程CPU支持专用硬件资源以独立地跟踪CPU中每个线程的状态,目的是线程由于长时延活动(如内存引用)而被阻塞时,以最小的延迟从一个上下文切换到另一个上下文(不会产生保存和恢复线程上下文的成本)。

同步多线程SMT将指令级并行技术和多线程技术相结合,以最大限度地利用硬件资源。来自多个线程的指令在同一时间周期内执行。为了支持SMT,CPU必须复制硬件来存储线程状态(程序计数器、寄存器等),跟踪乱序执行和投机执行的资源可以在线程间复制或分段共享。

3.5 存储器层次

CPU存储器层次划分基于两个基本特性:时间和空间局部性。

3.5.1 高速缓存层次

高速缓存时CPU流水线发出访存时的存储器层次中的第一级。理想情况下,流水线在具有最小访问延迟和无限容量缓存时表现最佳。实际上高速缓存访问时间随其容量的增加而增加。因此,高速缓存被组织为最接近执行单元的小型快速存储块的层次结构,且由更大、更慢的块进行备份。

高速缓存由多个确定大小的块(缓存行)组成,典型大小为64字节。L1大小通常在8KB~32KB,而LLC大小通常在64KB~16MB。任何层级的高速缓存的架构都可以由以下4个属性定义:
3.5.1.1 高速缓存中数据的放置

内存访问请求中的地址可以用来访问高速缓存。在直接映射中,内存块的地址只能出现在高速缓存中的一个位置。在全相联中,给定的缓存块可以放在高速缓存的任何位置。在组相联中,给定地址首先映射到一个组中,该地址可以映射在组中的任何位置。

3.5.1.2 在高速缓存中查找数据

                                        address:标签 索引 块偏移量

地址中的最低顺序位定义了块内偏移量,组则是基于索引位来选择,一旦组被选定,就可以使用标签位来与该组中的所有标签进行比较。如果其中一个标签与传入请求的标签匹配并且设施了有效位,则缓存命中。与该块条目相关联的数据被提供给流水线。如果不匹配,则缓存未命中。

3.5.1.3 管理缓存未命中

当发生高速未命中,控制器必须在缓存中选择要替换的块,以分配给导致缓存未命中的地址。直接映射只能分配一个位置,组相连可以分配组内任何位置,全相联可以分配所有位置。不过组相连和全相连一般会使用LRU策略来释放缓存块,为未命中地址腾出缓存空间。

3.5.1.4 管理写操作

CPU设计使用2种基本机制来处理高速缓存中的缓存命中写入操作:
        1. 写直达:命中的数据同时写入缓存块和层次结构中较低的层级。
        2. 写回:命中的数据只写入缓存。因此层次结构较低层级中就会包含过期数据,修改后的缓存行的状态通过标签中的脏标识来追踪。当修改后的缓存行最终被从缓存行中驱逐时,写回操作会强制将缓存行写回层次结构的较低层级中。

写入操作时的高速缓存未命中可以通过2种方式处理:
        1. 写分配:未命中位置的数据从层次结构中较低层级加载到高速缓存中,随后像写入命中情况一样处理剩余写入操作。
        2. 写不分配:未命中事务直接被发送到层次结构中所有的较低层级,并且缓存块不会被加载到高速缓存中。

大多数设计写分配+写回,写不分配+写直达策略。

3.5.1.5 其他高速缓存优化技术

从流水线的角度来说,任何访问请求的延迟都可以由以下公式计算出来:
        平均延迟 = 命中时间 + 未命中比例 * 未命中时间;

未命中比例高度依赖缓存的架构(块大小、关联性)以及运行在机器上的软件。

硬件和软件预取:减少缓存未命中以及后续停顿的方法之一,先于流水线需要将指令和数据预取到高速缓存层次的不同层级。

硬件预取器观察正在运行的应用程序的行为,并基于重复的高速缓存未命中规律启动预取。硬件预取技术可以自动适应程序行为,并且不需要优化编译器或者剖析功能的支持。另外,硬件预取也不会有额外的地址生成和指令预取开销。

软件预取是对硬件预取的补充,开发者可以通过特定的硬件指令提前指定需要的内存位置。编译器还可以自动将预取指令添加到代码中。预取技术需要平衡实际需求和预取请求,以避免预取流量挤压实际需求流量。

3.5.2 主存

主存使用大容量且成本合适的DRAM技术,主要属性定义为延迟、带宽和容量。延迟包括2部分,内存访问时间和内存周期时间。
内存访问时间:请求到数据可用时所消耗的时间。
内存周期时间:两个连续的内存访问之间所需的最短时间。

历史上,DRAM带宽每一代都得到提升,而延迟保持不变,甚至更高。

新的DRAM技术,GDDR和HBM在需要更大更宽的定制处理器上使用,所以不被DDR接口支持。

现代CPU支持多个独立通道的DRAM。一般而言,每一个内存通道的宽度是32位或者64位。

3.6 虚拟内存

虚拟内存是让所有运行在CPU上的进程可以共享属于该CPU的物理内存的机制。虚拟内存提供一种保护机制,可以限制其他进程对分配给指定进程内存的访问。虚拟内存还提供重定位机制,即能将程序加载到物理内存的任意位置而无需改变程序内寻址方式。

虚拟地址由提供虚拟地址和物理地址之间映射的专用硬件表翻译成物理地址,这些表被称为页表。

                                虚拟地址:虚拟页编号 页偏移量

其中虚拟页编号通过页表被转换为物理地址。如果请求的页不在主存内,则会导致缺页问题。

CPU通常使用层级结构的页表格式将虚拟地址位有效地映射到可用的物理内存,缺点是缺页代价很高,需要遍历整个层级结构。为了减少地址翻译时间,CPU支持TLB的硬件结构来缓存最近使用过的翻译。

3.7 SIMD多处理器

向量和矩阵计算都非常适合SIMD架构,因为向量或矩阵的每个元素都需要使用相同的指令进行处理。SIMD多处理器主要用于数据并行并且只需要少量功能和操作的特殊用途任务。MMX-SSE-AVX。

起初,新的SIMD指令以汇编的方式编程。后来,引入了特殊的编译器内建函数。

3.9 性能监控单元

现代CPU包含性能检测单元PMU,PMU有一组性能监控计数器PMC,用以收集程序运行过程中发生的各种性能事件。

PMU提供固定功能计数器以及可编程计数器。固定功能计数器总是测量CPU核内的同一事件,而可编程计数器由用户来选择想要测量的事件。通常,每个逻辑核有4个可编程计数器和3个固定功能计数器。固定功能通常被设置为计算核时钟、参考时钟和退休指令。

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

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

相关文章

20W IP网络吸顶喇叭 POE供电吸顶喇叭

SV-29852T 20W IP网络吸顶喇叭产品简介 产品用途: ◆室内豪华型吸顶喇叭一体化网络音频解码扬声器,用于广播分区音频解码、声音还原作用 ◆应用场地如火车站、地铁、教堂、工厂、仓库、公园停车场等;室内使用效果均佳。 产品特点&#xff…

vue-router中的一些 API

在Vue.js的vue-router中,一些重要api 1、RouterHistory:这是 vue-router 提供的路由历史记录对象。它可以跟踪当前页面的路由历史,并提供一些方法和属性来管理导航和历史记录。在 vue-router 中,有两种类型的路由历史记录对象&…

pytorch_lightning报错 You requested gpu: [1],But your machine only has: [0]

pytorch_lightning报错 You requested gpu: [1],But your machine only has: [0] 问题及分析 报错图片如下: 分析 gpu:[1]指代的gpu的标号,如果笔记本中只包含一个GPU,一般序号为[0].所以无法找到程序指定的GPU。 解决方法 …

机器学习之逻辑回归

import numpy as np import pandas as pd from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression # 获得数据 names[Sample code number,Clump Thickness,Uniformity…

编程语言学习笔记-架构师和工程师的区别,PHP架构师之路

🏆作者简介,黑夜开发者,全栈领域新星创作者✌,CSDN博客专家,阿里云社区专家博主,2023年6月CSDN上海赛道top4。 🏆数年电商行业从业经验,历任核心研发工程师,项目技术负责…

Egg.js构建一个stream流式接口服务

经常需要用到 stream 流式接口服务,比如:大文件下载、日志实时输出等等。本文将介绍如何使用Egg.js构建一个 stream 流式接口服务。 一、准备工作 目录结构: app//controllerindex.jstest.txttest.shindex.js 控制器test.txt 测试文件,最好…

5G+AI数字化智能工厂建设解决方案PPT

导读:原文《5GAI数字化智能工厂建设解决方案》(获取来源见文尾),本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考。数字化智能工厂定义 智能基础架构协同框架 - 端、边、云、网…

激光雷达 01 线数

一、线数 对于 360 旋转式和一维转镜式架构的激光雷达来说,有几组激光收发模块,垂直方向上就有几条线,被称为线数。这种情况下,线数就等同于激光雷达内部激光器的数量[参考]。 通俗来讲,线数越高,激光器的…

npm run xxx 的时候发生了什么?(以npm run dev举例说明)

文章目录 一、去package.json寻找scripts对应的命令二、去node_modules寻找vue-cli-service三、从package-lock.json获取.bin的软链接1. bin目录下的那些软连接存在于项目最外层的package-lock.json文件中。2.vue-cli-service文件的作用3.npm install 的作用 总结 一、去packag…

Google API实战与操作

Google api实战与操作 一. Google API 权限配置二. 操作API2.1 引入依赖2.2 导入代码 Google官网 实现一套用java程序控制GoogleAPI实现自动生成监控日报等功能,具体能操作Gsheet及document 一. Google API 权限配置 打开上面官网,新建项目 启用API 搜索sheet及document …

【山河送书第七期】:《强化学习:原理与Python实战》揭秘大模型核心技术RLHF!

《强化学习:原理与Python实战》揭秘大模型核心技术RLHF! 一图书简介二RLHF是什么?三RLHF适用于哪些任务?四RLHF和其他构造奖励模型的方法相比有何优劣?五什么样的人类反馈才是好反馈?六如何减小人类反馈带来…

LVGL图层的介绍

一.UI界面显示的图层 在lvgl开发的过程中,UI界面的显示都是位于lv_sct_act()图层 二.弹窗显示 lvgl开发过程中,有些窗口有可能在任何时候显示,比如错误信息弹窗,外部触发的一些中断。 这个时候,这些窗口不能建立在lv_s…

web前端开发基础入门html5+css3+js学习笔记(一)

目录 1.第一个前端程序2.前端工具的选择与安装3.VSCode开发者工具快捷键4.HTML5简介与基础骨架4.1 HTML5的DOCTYPE声明4.2 HTML5基本骨架4.2.1 html标签4.2.2 head标签4.2.3 body标签4.2.4 title标签4.2.5 meta标签 5.标签之标题5.1 快捷键5.1 标题标签位置摆放 6.标签之段落、…

LeetCode每日一题——2682. 找出转圈游戏输家

n 个朋友在玩游戏。这些朋友坐成一个圈&#xff0c;按 顺时针方向 从 1 到 n 编号。从第 i 个朋友的位置开始顺时针移动 1 步会到达第 (i 1) 个朋友的位置&#xff08;1 < i < n&#xff09;&#xff0c;而从第 n 个朋友的位置开始顺时针移动 1 步会回到第 1 个朋友的位…

leetcode 377. 组合总和 Ⅳ

2023.8.17 本题属于完全背包问题&#xff0c;乍一看和昨天那题 零钱兑换II 类似&#xff0c;但细看题目发现&#xff1a;今天这题是排列问题&#xff0c;而“零钱兑换II”是组合问题。排列问题强调顺序&#xff0c;而组合顺序不强调顺序。 这里先说个结论&#xff1a;先遍历物品…

并查集、树状数组

并查集、树状数组、线段树 并查集树状数组树状数组1 (单点修改&#xff0c;区间查询)树状数组2 (单点查询&#xff0c;区间修改) 并查集 【模板】并查集 题目描述 如题&#xff0c;现在有一个并查集&#xff0c;你需要完成合并和查询操作。 输入格式 第一行包含两个整数 …

Scala中的Either的用法

在 Scala 中&#xff0c;Either 是一种表示两种可能值的数据类型。它可以用来处理函数可能返回的两种不同类型的结果&#xff0c;通常用于错误处理或者结果分支情况。Either 有两个子类&#xff1a;Left 和 Right&#xff0c;其中 Left 通常用于表示错误或异常情况&#xff0c;…

1.物联网LWIP网络,TCP/IP协议簇

一。TCP/IP协议簇 1.应用层&#xff1a;FTP&#xff0c;HTTP&#xff0c;Telent&#xff0c;DNS&#xff0c;RIP 2.传输层&#xff1a;TCP&#xff0c;UDP 3.网络层&#xff1a;IPV4&#xff0c;IPV6&#xff0c;OSPF&#xff0c;EIGRP 4.数据链路层&#xff1a;Ethernet&#…

YOLOv5改进系列(21)——替换主干网络之RepViT(清华 ICCV 2023|最新开源移动端ViT)

【YOLOv5改进系列】前期回顾: YOLOv5改进系列(0)——重要性能指标与训练结果评价及分析 YOLOv5改进系列(1)——添加SE注意力机制 YOLOv5改进系列(2

两阶段提交:详解数据库宕机引起的主从不一致问题、redolog与binlog的两阶段提交

0、基础知识and问题 从基础上我们了解&#xff1a; &#xff08;1&#xff09;redolog作为数据库保证持久化的日志&#xff0c;在update事务提交后就会按一定的策略刷入磁盘中&#xff0c;在刷入后&#xff0c;即使数据库断电宕机&#xff0c;mysql也能从redolog中恢复数据到磁…