26考研——中央处理器_指令流水线_流水线的冒险与处理 流水线的性能指标 高级流水线技术(5)
408答疑
文章目录
- 六、指令流水线
- 流水线的冒险与处理
- 结构冒险
- 数据冒险
- 延迟执行相关指令
- 采用转发(旁路)技术
- load-use 数据冒险的处理
- 控制冒险
- 流水线的性能指标
- 流水线的吞吐率
- 流水线的加速比
- 高级流水线技术
- 超标量流水线技术
- 超长指令字技术
- 超流水线技术
- 八、参考资料
- 鲍鱼科技课件
- 26王道考研书
六、指令流水线
流水线的冒险与处理
- 在指令流水线中,可能遇到一些情况使得后续指令无法正确执行而引起流水线阻塞,这种现象称为流水线冒险。根据导致冒险的原因不同分为结构冒险、数据冒险和控制冒险 3 种。
- 不同类型指令在各流水段的操作是不同的,下表中列出了几类指令在各流水段中的操作。
指令 | 流水段 | ||||
---|---|---|---|---|---|
IF | ID | EX | MEM | WB | |
ALU | 取指 | 译码,读寄存器堆 | 执行 | — | 结果与回寄存器堆 |
取/存 | 取指 | 译码,读寄存器堆 | 计算访存有效地址 | 访存(读/写) | 将读出的数据写入寄存器堆/— |
转移 | 取指 | 译码,读寄存器堆 | 计算转移目的地址,设置条件码 | 若条件成立,将转移目的地址送 PC | — |
结构冒险
- 由不同指令在同一时刻争用同一功能部件而形成的冲突,也称资源冲突,即由硬件资源竞争造成的冲突。
- 例如,指令和数据通常都存放在同一存储器中,在第 4 个时钟周期,第 i i i 条 LOAD 指令进入 MEM 段时,第 i + 3 i+3 i+3 条指令的 IF 段也要访存取指令,此时会发生访存冲突,为此可在前一条指令访存时,暂停(一个时钟周期)取后一条指令的操作,如下表所示。当然,若第 i i i 条指令不是 LOAD 指令,则在 MEM 段不访存,也就不会发生访存冲突。
指令 | 流水段 | ||||
---|---|---|---|---|---|
IF | ID | EX | MEM | WB | |
取 | 取指 | 译码,读寄存器堆 | 计算访存有效地址 | 访存(读/写) | 将读出的数据写入寄存器堆 |
指令 | 时钟周期 | ||||||||
---|---|---|---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
LOAD 指令 | IF | ID | EX | MEM | WB | ||||
指令 i + 1 | IF | ID | EX | MEM | WB | ||||
指令 i + 2 | IF | ID | EX | MEM | WB | ||||
指令 i + 3 | 停顿 | IF | ID | EX | MEM | WB | |||
指令 i + 4 | IF | ID | EX | MEM |
- 解决结构冲突有以下两种办法:
- 前一条指令访存时,使后一条相关指令(及其后续指令)暂停一个时钟周期。
- 设置多个独立的部件。
- 例如,对于寄存器访问冲突,可将寄存器的读口和写口独立开来;
- 对于访存冲突,单独设置数据存储器和指令存储器。在现代 Cache 机制中,L1 级 Cache 通常采用数据 Cache 和指令 Cache 分离的方式,从而也就避免了资源冲突的发生。
数据冒险
- 数据冒险也称数据相关。引起数据冒险的原因是,后面指令用到前面指令的结果时,前面指令的结果还没有产生。
- 在以非乱序执行的流水线中,所有数据冒险都是因为前面指令写结果之前,后面指令就需要读取而造成的,这种数据冒险称为写后读(Read After Write, RAW)冲突。
在按序执行的流水线中(统考中通常采用这种方式),只可能出现 RAW 冲突。
例如,考虑下列两条指令:
I1: add R1, R2, R3 # (R2) + (R3) → R1
I2: sub R4, R1, R5 # (R1) - (R5) → R4
- 在写后读(RAW)冲突中,指令 I2 的源操作数是指令 I1 的目的操作数。正常的读/写顺序是由指令 I1 先写入 R1,再由指令 I2 来读 R1。
- 在非流水线中,这种先写后读的顺序是自然维持的。
- 但在流水线中,由于重叠操作,读/写的先后顺序关系发生了变化,如下表所示。
指令 | 流水段 | ||||
---|---|---|---|---|---|
IF | ID | EX | MEM | WB | |
ALU | 取指 | 译码,读寄存器堆 | 执行 | — | 结果与回寄存器堆 |
- 可以采用以下几种办法解决 RAW 数据冲突。
延迟执行相关指令
- 把遇到数据相关的指令及其后续指令都暂停一至几个时钟周期,直到数据相关问题消失后再继续执行,可分为软件插入空操作 “nop” 指令和硬件阻塞(stall)两种方法。
- 如下表所示,在第 5 个时钟周期,add 指令才将运算结果写入 R1,但后继 sub 指令在第 3 个时钟周期就要从 R1 中读数,使先写后读的顺序改变为先读后写,发生了先写后读(RAW)的数据冲突。
- 若不采取措施,按上表的读/写顺序,则会导致结果出错。
- 为此,可以暂停 sub 指令 3 个时钟周期,直至前面 add 指令的结果生成,如下表所示。
指令 | 时钟周期 | ||||||||
---|---|---|---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
add | IF | ID | EX | MEM | WB | ||||
sub | 阻塞 | 阻塞 | 阻塞 | IF | ID | EX | MEM | WB |
- 对于 I1 和 I2 的数据相关问题,还可以通过将寄存器的写口和读口分别控制在前、后半个时钟周期内操作,使前半周期写入 R1 的值在后半周期马上被读出,在一个周期内读/写寄存器不会产生冲突,这样 I1 的 WB 段和 I2 的 ID 段就可重叠执行,从而只需延迟 2 个时钟周期。
采用转发(旁路)技术
-
设置相关转发通路,不等前一条指令把计算结果写回寄存器,下一条指令也不再从寄存器读,而将数据通路中生成的中间数据直接转发到 ALU 的输入端。
-
如下表所示,指令 I1 在 EX 段结束时已得到 R1 的新值,被存放到 EX/MEM 流水段寄存器中,因此可以直接从该流水段寄存器中取出数据发送到 ALU 的输入端,这样,在指令 I2 执行时 ALU 中用的就是 R1 的新值。
-
增加转发通路后,相邻两条运算类指令之间、相隔一条的两个运算类指令之间的数据相关问题就都能解决了。
load-use 数据冒险的处理
- 若 load 指令与其后紧邻的运算类指令存在数据相关问题,则无法通过转发技术来解决,通常把这种情况称为 load-use 数据冒险。
- 对于下列两条指令,load 指令只有在 MEM 段结束时才能得到主存中的结果,然后送 MEM/WB 流水段寄存器,在 WB 段的前半周期才能存入 R2 的新值,但随后的 add 指令在 EX 阶段就要取 R2 的值,因此,得到的是旧值。
I2: load r2, 12(r1) # M[(r1)+12] → (r2)
I3: add r4, r3, r2 # (r3) + (r2) → (r4)
-
对于 load-use 数据冒险,最简单的做法是由编译器在 add 指令之前插入一条 nop 指令,这样在 add 指令的 EX 段就可以从 MEM/WB 流水段寄存器中取出 load 指令的最新结果,如下表所示。
-
当然,最好的办法是在程序编译时进行优化,通过调整指令顺序以避免出现 load-use 现象。
控制冒险
- 指令通常是顺序执行的,但当遇到改变指令执行顺序的情况,例如执行转移或返回指令、发生中断或异常时,会改变 PC 值,从而造成断流,也称控制冒险。
- 对于由转移指令引起的冲突,最简单的处理方法就是推迟后续指令的执行。
- 通常把因流水线阻塞带来的延迟时钟周期数称为延迟损失时间片 C。
- 在下列指令中,假设 R2 存放常数 N,R1 的初值为 1,bne 指令在 EX 段通过计算设置条件码,并在 MEM 段确定是否将 PC 值更新为转移目的地址,因此仅当 bne 指令执行到第 5 个时钟结束时才能将转移目标地址送 PC。
- 为此,在数据通路检测到分支指令后,可以在分支指令后插入 C(此处 C = 3)条 nop 指令,如下表所示。
I1: loop: add R1, R1, 1 # (R1) + 1 → R1
I2: bne R1, R2, loop # if (R1) != (R2) goto loop
指令 | 流水段 | ||||
---|---|---|---|---|---|
IF | ID | EX | MEM | WB | |
转移 | 取指 | 译码,读寄存器堆 | 计算转移目的地址,设置条件码 | 若条件成立,将转移目的地址送 PC | — |
指令 | 时钟周期 | |||||||||
---|---|---|---|---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | |
add | IF | ID | EX | MEM | WB | |||||
bne | IF | ID | EX | MEM | WB | |||||
add | IF | ID | EX | MEM | WB |
- 有以下几种方法解决控制冲突:
- 对于由转移指令引起的冲突,可采用和解决数据冲突相同的软件插入 “nop” 指令和硬件阻塞(stall)的方法。比如,延迟损失多少时间片,就插入多少条 nop 指令。
- 对转移指令进行分支预测,尽早生成转移目标地址。分支预测分为简单(静态)预测和动态预测。若静态预测的条件总是不满足,则按序继续执行分支指令的后续指令。动态预测根据程序转移的历史情况,进行动态预测调整,有较高的预测准确率。
Cache 缺失的处理过程也会引起流水线阻塞。
流水线的性能指标
流水线的吞吐率
-
流水线的吞吐率是指在单位时间内流水线所完成的任务数量,或输出结果的数量。
- 流水线吞吐率(TP)的最基本公式为
T P = n T k TP = \frac{n}{T_k} TP=Tkn
- 式中, n n n 是任务数, T k T_k Tk 是处理完 n n n 个任务所用的总时间。
-
设 k k k 为流水线的段数, Δ t \Delta t Δt 为时钟周期。在输入流水线中的任务连续的理想情况下,一条 k k k 段流水线能在 k + n − 1 k + n - 1 k+n−1 个时钟周期内完成 n n n 个任务。得出流水线的吞吐率为
T P = n ( k + n − 1 ) Δ t TP = \frac{n}{(k + n - 1)\Delta t} TP=(k+n−1)Δtn
- 连续输入的任务数 n → ∞ n \to \infty n→∞ 时,得到最大吞吐率为 T P max = 1 Δ t TP_{\text{max}} = \frac{1}{\Delta t} TPmax=Δt1。
流水线的加速比
-
完成同样一批任务,不使用流水线与使用流水线所用的时间之比。
- 流水线加速比(S)的基本公式为
S = T 0 T k S = \frac{T_0}{T_k} S=TkT0
- 式中, T 0 T_0 T0 表示不使用流水线的总时间: T k T_k Tk 表示使用流水线的总时间。
-
一条 k k k 段流水线完成 n n n 个任务所需的时间为 T k = ( k + n − 1 ) Δ t T_k = (k + n - 1)\Delta t Tk=(k+n−1)Δt;顺序执行 n n n 个任务时,所需的总时间为 T 0 = k n Δ t T_0 = kn\Delta t T0=knΔt。
- 将 T 0 T_0 T0 和 T k T_k Tk 值代入上式,得出流水线的加速比为
S = k n Δ t ( k + n − 1 ) Δ t = k n k + n − 1 S = \frac{kn\Delta t}{(k + n - 1)\Delta t} = \frac{kn}{k + n - 1} S=(k+n−1)ΔtknΔt=k+n−1kn
- 连续输入的任务数 n → ∞ n \to \infty n→∞ 时,得最大加速比为 S max = k S_{\text{max}} = k Smax=k。
高级流水线技术
- 有两种增加指令级并行的策略:
- 多发射技术:通过采用多个内部功能部件,使流水线功能段能同时处理多条指令,处理机一次可以发射多条指令进入流水线执行。
- 超流水线技术:通过增加流水线级数来使更多的指令同时在流水线中重叠执行。
超标量流水线技术
也称动态多发射技术,每个时钟周期内可并发多条独立指令,以并行操作方式将两条或多条指令编译并执行,为此需配置多个功能部件,如下图所示。
- 在简单的超标量 CPU 中,指令是按顺序发射执行的。
- 为了更好地提高并行性能,多数超标量 CPU 都结合动态流水线调度技术,通过动态分支预测等手段,指令不按顺序执行,这种方式称为乱序执行。
超长指令字技术
也称静态多发射技术,由编译程序挖掘出指令间潜在的并行性,将多条能并行操作的指令组合成一条具有多个操作码字段的超长指令字(可达几百位),为此需要采用多个处理部件。
超流水线技术
- 流水线功能段划分得越多,时钟周期就越短,指令吞吐率也就越高,因此超流水线技术是通过提高流水线主频的方式来提升流水线性能的,如下图所示。
- 但是,流水线级数越多,用于流水寄存器的开销就越大,因此流水线级数是有限制的,并不是越多越好。
- 超标量流水线 CPU 在流水线充满后,每个时钟周期还是执行一条指令, C P I = 1 CPI = 1 CPI=1,但其主频更高;多发射流水线 CPU 每个时钟周期可以处理多条指令, C P I < 1 CPI < 1 CPI<1,但其成本更高、控制更复杂。
八、参考资料
鲍鱼科技课件
b站免费王道课后题讲解:
网课全程班:
26王道考研书
相关文章:

26考研——中央处理器_指令流水线_流水线的冒险与处理 流水线的性能指标 高级流水线技术(5)
408答疑 文章目录 六、指令流水线流水线的冒险与处理结构冒险数据冒险延迟执行相关指令采用转发(旁路)技术load-use 数据冒险的处理 控制冒险 流水线的性能指标流水线的吞吐率流水线的加速比 高级流水线技术超标量流水线技术超长指令字技术超流水线技术 …...
Java 与 Go 语言对比
Java 和 Go (Golang) 是两种流行的编程语言,各有其设计哲学和应用场景。以下是它们的详细对比: 1. 基本特性 特性JavaGo诞生时间1995 (Sun Microsystems)2009 (Google)设计目标“Write Once, Run Anywhere”简洁、高效的系统编程语言语言类型面向对象多…...
OpenUCX 库介绍与使用指南
OpenUCX 库介绍与使用指南 OpenUCX 简介 OpenUCX (Unified Communication X) 是一个高性能、开源通信框架,专为大规模分布式计算和加速计算设计。它提供了统一的API,支持多种网络硬件和协议,包括InfiniBand、RoCE、TCP等。 主要特点 高性…...

酒店旅游类数据采集API接口之携程数据获取地方美食品列表 获取地方美餐馆列表 景点评论
携程 API 接入指南 API 地址: 调用示例: 美食列表 景点列表 景点详情 酒店详情 参数说明 通用参数说明 请谨慎传递参数,避免不必要的费用扣除。 URL 说明:https://api-gw.cn/平台/API类型/ 平台:淘宝,京…...

Lora原理及实现浅析
Lora 什么是Lora Lora的原始论文为《LoRA: Low-Rank Adaptation of Large Language Models》,翻译为中文为“大语言模型的低秩自适应”。最初是为了解决大型语言模在进行任务特定微调时消耗大量资源的问题;随后也用在了Diffusion等领域,用于…...
GitHub 趋势日报 (2025年05月13日)
本日报由 TrendForge 系统生成 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日整体趋势 Top 10 排名项目名称项目描述今日获星总星数语言1harry0703/MoneyPrinterTurbo利用ai大模型,一键生成高清短视频使用…...

【设计模式】- 创建者模式
单例模型 饿汉式 静态方法创建对象 public class Singleton {// 私有构造方法private Singleton(){}private static Singleton instance new Singleton();// 提供一个外界获取的方法public static Singleton getInstance(){return instance;} }静态代码块创建对象 public …...
服务器时间发生跳变导致hghac中对应主机状态频繁切换为crash或stop
文章目录 环境症状问题原因解决方案相关文档报错编码 环境 系统平台:N/A 版本:N/A 症状 集群状态: [rootbthbj-hgywsjkjq-ip28-cen76 ~]# hghactl list Cluster: highgo-ee-cluster —---------------------—---------- | Member | Ho…...

南审计院考研分享会 经验总结
汪学长 – 中科大 计科专硕 初试准备 数学先做真题,模拟题刷的越多分越高;408真题最重要,模拟题辅助;英语只做真题;政治9月份开始背 代码能力在低年级培养的重要性和路径 考研不选择机构原因 因为机构里面学习的框…...

牛客练习赛138(首篇万字题解???)
赛时成绩如下: 1. 小s的签到题 小s拿到了一个比赛榜单,他要用最快的速度找到签到题,但是小s脑子还是有点晕,请你帮帮小s,助力他找到签到题。 比赛榜单是一个 2 行 n 列的表格: 第一行是 n 个大写字母&#…...
Rust 中的 `String`、`str` 和 `str`:深入解析与使用指南
在 Rust 编程中,字符串是不可或缺的数据类型,但 Rust 的字符串系统与其他语言有所不同。Rust 提供了 String、str 和 &str 三种主要的字符串类型,每种类型都有其独特的用途和特点。本文将详细介绍这三种字符串类型,帮助你更好…...
深入理解高性能网络通信:从内核源码到云原生实践
深入理解高性能网络通信:从内核源码到云原生实践 (示意图:Linux网络协议栈与通信架构分层模型) 随着互联网业务规模的不断扩大,系统对网络通信性能的要求也在迅速提升。从内核事件机制的演进到云原生架构下的极致优化&…...
10 web 自动化之 yaml 数据/日志/截图
文章目录 一、yaml 数据获取二、日志获取三、截图 一、yaml 数据获取 需要安装 PyYAML 库 import yaml import os from TestPOM.common import dir_config as Dir import jsonpathclass Data:def __init__(self,keyNone,file_name"test_datas.yaml"):file_path os…...
ubuntu清除缓存
pip pip cache purgeconda conda clean -a -yapt apt cleanapt-get apt-get cleanmodelscope modelscope clear-cachehuggingface rm -rf ~/.cache/huggingface/*...
OSI 7层模型
OSI 7层模型: 1、物理层(光纤等把电脑连接起来的物理手段) 2、数据链路层(以太网,确认0和1电信号的分组方式,负责MAC地址,MAC地址用于在网络中唯一标示一个网卡,相当于网卡的身份证…...

用git下载vcpkg时出现Connection was reset时的处理
用git安装vcpkg时出现Connect was rest(如上图)。多谢这位网友的博文解决了问题: 通过:http.sslVerify false全局来设置,执行以下命令: git config --global http.sslVerify "false" 原文链接:…...
deepseek梳理java高级开发工程师算法面试题
Java高级工程师算法面试题与答案 一、数据结构与算法基础 1. 红黑树与AVL树比较 题目:详细说明红黑树和AVL树的区别及各自的适用场景,并用Java实现红黑树的插入操作。 答案: 区别对比: ┌─────────────────…...

leetcode - 滑动窗口问题集
目录 前言 题1 长度最小的子数组: 思考: 参考代码1: 参考代码2: 题2 无重复字符的最长子串: 思考: 参考代码1: 参考代码2: 题3 最大连续1的个数 III: 思考&am…...

一分钟在Cherry Studio和VSCode集成火山引擎veimagex-mcp
MCP的出现打通了AI模型和外部数据库、网页API等资源,成倍提升工作效率。近期火山引擎团队推出了 MCP Server SDK: veimagex-mcp。本文介绍如何在Cherry Studio 和VSCode平台集成 veimagex-mcp。 什么是MCP MCP(Model Context Protocol&…...

Tomcat与纯 Java Socket 实现远程通信的区别
Servlet 容器(如 Tomcat) 是一个管理 Servlet 生命周期的运行环境,主要功能包括: 协议解析:自动处理 HTTP 请求/响应的底层协议(如报文头解析、状态码生成); 线程…...

为什么企业建站或独立站选用WordPress
与大多数组织相比,企业业务更需要保持可扩展和可靠的网络存在,以保持竞争力。为此,许多大型企业的 IT 领导者历来寻求昂贵的网络解决方案,这些方案需要签订专有支持合同来保证质量。不过,还有另一种方法。WordPress问世…...

镜头内常见的马达类型(私人笔记)
① 螺杆式马达 驱动来源:机身内马达。镜头尾部有一个接收“螺杆”的接口,通过机械传动带动镜头对焦组。缺点:慢、吵、不能用于无机身马达的相机。✅ 典型镜头:尼康 AF、AF-D 系列;美能达老镜头。尼康传统的AF镜头通过…...
docker-compose——安装mysql8
一、编写Dockerfile FROM mysql:8.0.39 ENV TZAsia/Shanghai RUN ln -sf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone二、编写docker-compose.yml version : 3.8services:zaomeng-mysql:build:context: ./mysqlimage: mysql:8.0.39conta…...

从代码学习深度学习 - 语义分割和数据集 PyTorch版
文章目录 前言什么是语义分割?图像分割和实例分割Pascal VOC2012 语义分割数据集Pascal VOC2012 语义分割数据集介绍基本信息语义分割部分特点数据格式评价指标应用价值数据集获取使用提示辅助工具代码 (`utils_for_huitu.py`)读取数据预处理数据自定义语义分割数据集类读取数…...

4G物联网模块实现废气处理全流程数据可视化监控配置
一、项目背景 随着工业化进程的加速,工业废气的排放对环境造成了严重影响,废气处理厂应运而生。然而,废气处理厂中的设备众多且分散,传统的人工巡检和数据记录方式效率低下,难以及时发现问题。为了实现对废气处理设备…...
深圳SMT贴片加工厂制造流程解析
内容概要 作为大湾区电子制造产业链的重要节点,深圳SMT贴片加工厂凭借精密的生产体系与技术创新,构建了涵盖12道核心工序的标准化流程。从PCB基板的来料检验开始,通过全自动贴片机的高精度元件定位、SPI三维锡膏检测、智能温控回流焊接等关键…...

电商平台如何做好DDoS 攻防战?
一、新型 DDoS 攻击技术演进分析 1.1 电商平台面临的四类攻击范式 graph LR A[DDoS攻击] --> B{网络层} A --> C{应用层} B --> D[CLDAP反射攻击<br>峰值达3.5Tbps] B --> E[QUIC协议洪水攻击] C --> F[API CC攻击<br>精准打击抢购接口] C -->…...
Spark处理过程-转换算子
大家前面的课程,我们学习了Spark RDD的基础知识,知道了如何去创建RDD,那spark中具体有哪些rdd,它们有什么特点呢? 我们这节课来学习。 (一)RDD的处理过程 Spark使用Scala语言实现了RDD的API,程…...

【计算机视觉】OpenCV实战项目:Athlete-Pose-Detection 运动员姿态检测系统:基于OpenCV的实时运动分析技术
运动员姿态检测系统:基于OpenCV的实时运动分析技术 1. 项目概述1.1 技术背景1.2 项目特点 2. 技术架构与算法原理2.1 系统架构2.2 核心算法2.3 模型选择 3. 项目部署与运行指南3.1 环境准备硬件要求软件依赖 3.2 项目配置3.3 运行项目基本运行模式高级参数 4. 常见问…...
Java 性能调优全解析:从设计模式到 JVM 的 7 大核心方向实践
引言 在高并发、低延迟的技术场景中,Java 性能优化需要系统化的方法论支撑。本文基于7 大核心优化方向(复用优化、计算优化、结果集优化、资源冲突优化、算法优化、高效实现、JVM 优化),结合权威框架与真实案例,构建从…...