ridecore流水线解读
文章目录
- 流水线stage分属前后端
- PC
- pipeline
- IF
- ID
- DP
- DP 与 SW 中间没有latch
- SW
- COM
- 源码地址
流水线stage分属前后端
IF -> ID -> DP -> SW -> EX -> COM
分类 | 阶段 | 说明 |
---|---|---|
前端 | IF | 指令获取阶段。PC 使用分支预测器,访问指令存储器。典型前端操作。 |
前端 | ID | 解码并寄存器重命名,这仍然属于前端操作,因为没有开始实际执行。 |
中间(交界处) | DP | 分发阶段是前端和后端的“桥梁”:它决定指令是否能够进入执行系统(Reservation Station)。 |
后端 | SW | Issue 阶段已经涉及硬件调度和等待执行资源。 |
后端 | EX | 执行阶段。指令在对应的执行单元中运行。 |
后端 | COM | 提交/写回阶段,更新寄存器状态和 ROB,彻底属于后端。 |
Dispatch(DP)阶段通常被认为是“前端的最后阶段”或者“前后端的分界点”。它从解码器/寄存器重命名器中取出指令,并将它们放入合适的 Reservation Station(RS)。你可以把它看成是:前端准备好的指令交给后端执行的关键一步,所以分析系统时,很多资料会将 DP 归为前端,但也有资料将它作为交界点来单独分析。结论:DP 更偏向前端,但有一定后端属性。
PC
PC的值根据优先级优先级1(top) : reset时 : ENTRY_POINT // 来自于 芯片定义优先级2 : prmiss : jmpaddr // 来自于 exunit_branch: stall_IF : pc // 来自于 流水线的stall: 其余情况 : npc // 来自于 IF 模块的npc
pipeline
IF
- 负责项
1.指令的获取及invalid // 不考虑
2.npc的计算
- npc 计算原理
npc的计算gshare 命中 : btb中计算出来的 地址第二条指令 invalid : pc+4其他 : pc+8gshare 的设计 // 属于分支预测模块BHR // 分支历史寄存器PHT // 模式历史表PCBTB // 分支目标缓冲区流程在每个时钟的负边沿,使用的读取地址是 PC[12:3] 和 BHR 做异或(⊕)得到的结果, 从 PHT 中读取预测信息. 如果(读出的值大于1,即2或3)跳转(Taken):用 PC 查 BTB → 得到 跳转目标地址将目标地址 更新到 npc否则(Not Taken):npc += 4 or 8(顺序执行)模块读写BHR 的读写会基于当前预测结果进行更新;但如果最终证明预测是错误的,BHR 会回滚到更新前的状态。因此,在每次更新之前,BHR 都会先被备份。PHT 的读写 // PHT 是 Gshare 预测器中的一个数组,数组中的每个单元是一个2 位饱和计数器读一个用于 IF 阶段;一个用于 COM 阶段。写一个写端口用于 COM 阶段的写操作 // 在时钟的负边沿先读取当前值 , // 然后在正边沿写入更新后的值// 当一条分支指令完成时,会对其对应的 PHT 条目进行更新// 如果条件是“跳转”,则对应计数器加1;// 如果是“不跳转”,则计数器减1。// 饱和计数器最多为3,最少为0,典型行为如下:0,1 → Not Taken;2,3 → Taken(实现 hysteresis)BTB 的读写TODO
- 问题
1. 按地址 0x4 取指, 那么 inst2 会 invalid 吗 ? 另外, 岂不是 会存在 一拍 没有 inst2 发送到后端 会是的,确实会出现某一拍中只有一条有效指令(Inst1)被送入 IF/ID latch。
ID
1. 给 每一条处于投机路径的指令 分配一个 Speculative Tag // 分支预测相关// 目的是在 exunit_branch 模块 验证出 分支预测失败 时,清楚知道哪些指令是错误路径的,需要取消、回滚// 它的主要目的是跟踪指令的投机状态,以便在分支预测失败时快速恢复系统状态。// 和 用于寄存器重命名的 tag 是 两个系统。// 注意混淆 :// 1. 两者都用到了 "tag" 一词// 2. 两者都需要唯一标识一条或一组指令// 3. 它们都在支持乱序执行
2. 解码 // 不考虑
项目 | 内容 |
---|---|
功能 | 为每条投机路径上的指令分配 Speculative Tag,以支持分支恢复 |
核心输出 | sptagN 和 speculativeN |
使用者 | Decoder、Dispatch、ROB、RS(Reservation Station)、Commit 等 |
解决问题 | 精确追踪投机指令,支持分支预测失败时快速恢复系统状态 |
模块 | 主要用途 |
---|---|
寄存器重命名 tag(如RRF中分配的物理寄存器编号) | 建立写后读/写后写依赖关系,支持乱序执行 |
投机 tag(Tag Generator 生成) | 标记哪些指令是投机的,支持错误恢复 |
以一个预测成功的分支为例:
- 分支指令 B 发射 →
branchvalid1=1
,enable=1
- Tag Generator:
- 分配一个新的 Tag(比如
00010
) - 设置
sptag1=00010
,speculative1=1
tagreg
左移(进入下一轮准备)brdepth+1
- 分配一个新的 Tag(比如
- 后续投机指令 C、D、E 都被分配同样的
sptag=00010
- 如果分支 B 后来预测成功(
prsuccess=1
):brdepth--
,该 Tag 被释放,其他无影响
- 如果分支 B 后来预测失败(
prmiss=1
):tagreg ← tagregfix
(恢复到分支预测前状态)brdepth ← 0
- 所有
sptag==00010
的指令都将被清除(flush)
阶段 | 动作 | 模块 | 说明 |
---|---|---|---|
IF | 预测(Prediction) | Branch Predictor(BTB / GShare) | 猜跳不跳、跳到哪,控制 PC |
ID | 恢复环境(Prediction) | Speculative Tag gen | 跟踪指令的投机状态 |
EX | 验证(Resolution) | exunit_branch | 分支指令实际执行,看预测对不对,发出 prsuccess / prmiss 信号 |
DP
- 负责项
1.为每个指令中的"被写入寄存器" 分配 rename register
2.
- tag generator 与 寄存器重命名机制 原理
tag generator避免 写后读(RAW)(Read After Write)、写后写(WAW)、读后写(WAR) 等寄存器冲突(乱序执行导致的冲突)问题,会使用寄存器重命名机制每条指令的目标寄存器在进入后端之前都会被重新命名为一个“Tag”,这个 tag 是由 Tag Generator 生成的。
模块 | 功能 |
---|---|
Tag Generator | 为目标寄存器生成唯一的标识符(Tag),用于寄存器重命名与依赖跟踪 |
所在阶段 | 通常在 Decode 或 Dispatch 阶段 |
在乱序中的地位 | 关键,维持指令依赖关系和正确性 |
模块Architected Register File (ARF):程序员视角下的寄存器集合(逻辑寄存器)Rename Register File (RRF):物理寄存器集合(或者是寄存器标记表)Reorder Buffer (ROB):保持提交顺序,支持恢复/回滚Tag Generator:为每条指令分配唯一标识符(tag),表示结果的位置
步骤 | 描述 |
---|---|
分配 tag | 为每个目标寄存器分配唯一 tag |
更新 Rename Table | 建立逻辑寄存器到物理 tag 的映射 |
消除冒险 | 使用 tag 跟踪依赖,避免多个指令写同一个寄存器 |
回写/提交 | 使用 ROB 确保乱序执行但顺序提交 |
如果只是顺序执行,那么根本不需要引入 RRF
为了支持乱序执行,必须引入物理寄存器(RRF)来保存未提交的指令结果,并通过 tag 建立依赖关系,使得即使写同一个逻辑寄存器也能正确调度。
乱序执行了之后,也需要计算依赖,然后重新执行吧,是不是浪费资源了只有发生 分支错误预测 时,才需要回滚和重新执行后续指令。这种情况虽然代价高,但在正确率高的预测器(如 Gshare)下,概率已经较低。
DP 与 SW 中间没有latch
SW
COM
相关文章:
ridecore流水线解读
文章目录 流水线stage分属前后端PCpipelineIFIDDPDP 与 SW 中间没有latchSWCOM 源码地址 流水线stage分属前后端 IF -> ID -> DP -> SW -> EX -> COM分类阶段说明前端IF指令获取阶段。PC 使用分支预测器,访问指令存储器。典型前端操作。前端ID解码并…...
基于C语言实现网络爬虫程序设计
如何用好C语言来做爬虫,想必接触过的大神都能说扥头头是道,但是对于新手小白来说,有这么几点需要注意的。根据设计程序结构,我们需要一个队列来管理待爬取的URL,一个集合或列表来记录已访问的URL。主循环从队列中取出U…...
github 上的 CI/CD 的尝试
效果 步骤 新建仓库设置仓库的 page 新建一个 vite 的项目,改一下 vite.config.js 中的 base 工作流 在项目的根目录下新建一个 .github/workflows/ci.yml 文件,然后编辑一下内容 name: Build & Deploy Vue 3 Appon:push:branches: [main]permi…...
飞书配置表数据同步到数据库中
这是我的从飞书取数据的代码 def get_employee_from_feishu():staff_setting settings.FEISHU_SETTING["sales_order"]["employee"]app_token staff_setting ["app_token"]table_id staff_setting ["table_id"]page_token Noneh…...
Nacos源码—9.Nacos升级gRPC分析八
大纲 10.gRPC客户端初始化分析 11.gRPC客户端的心跳机制(健康检查) 12.gRPC服务端如何处理客户端的建立连接请求 13.gRPC服务端如何映射各种请求与对应的Handler处理类 14.gRPC简单介绍 12.gRPC服务端如何处理客户端的建立连接请求 (1)gRPC服务端是如何启动的 (2)connec…...
开源免费无广告专注PDF编辑、修复和管理工具 办公学术 救星工具
各位PDF处理小能手们!我跟你们说啊,今天要给大家介绍一款超牛的国产开源PDF处理工具,叫PDFPatcher,也叫PDF补丁丁。它就像一个PDF文档的超级修理工,专门解决PDF编辑、修复和管理的各种难题。 这软件的核心功能和特点&a…...
C++设计模式——单例模式
单例模式 方法1:C11 线程不安全懒汉模式(不推荐) 懒汉式单例模式在第一次使用时才创建实例,但这种方式在多线程环境下可能会出现问题。 class Singleton { private:static Singleton* instance; // 静态指针,用于存储…...
装饰器在Python中的作用及在PyTorchMMDetection中的实战应用
装饰器在Python中的作用 1. 装饰器是什么?为什么它很重要? 装饰器(Decorator)是Python中的一种高级语法,用于在不修改原函数代码的情况下,动态增强函数的功能。它的核心思想是**"装饰"现有函数*…...
时间序列预测建模的完整流程以及数据分析【学习记录】
文章目录 1.时间序列建模的完整流程2. 模型选取的和数据集2.1.ARIMA模型2.2.数据集介绍 3.时间序列建模3.1.数据获取3.2.处理数据中的异常值3.2.1.Nan值3.2.2.异常值的检测和处理(Z-Score方法) 3.3.离散度3.4.Z-Score3.4.1.概述3.4.2.公式3.4.3.Z-Score与…...
【工作记录】Kong Gateway入门篇之简介
1. 什么是 Kong Gateway? Kong Gateway 是一个开源的、云原生的 API 网关,专为现代微服务架构设计。它基于 Nginx 和 Lua 构建,提供了高性能、可扩展的 API 管理解决方案。Kong Gateway 不仅能够处理 API 请求的路由和负载均衡,还…...
华为鸿蒙电脑能否作为开发机?开发非鸿蒙应用?
目录 一、鸿蒙电脑作为开发机的核心能力1. 硬件与系统架构2. 开发工具链支持 二、开发非鸿蒙应用的可行性分析1. 适配优势与局限性2. 生态限制 三、鸿蒙电脑的核心适用场景1. 推荐开发场景2. 目标用户群体3. 非推荐场景 四、未来生态演进与战略意义五、总结 一、鸿蒙电脑作为开…...
jackson-dataformat-xml引入使用后,响应体全是xml
解决方案: https://spring.io/blog/2013/05/11/content-negotiation-using-spring-mvc import org.springframework.context.annotation.Configuration; import org.springframework.http.MediaType; import org.springframework.web.servlet.config.annotation.Con…...
【deekseek】TCP Offload Engine
是的,TOE(TCP Offload Engine)通过专用硬件电路(如ASIC或FPGA)完整实现了TCP/IP协议栈,将原本由CPU软件处理的协议计算任务完全转移到网卡硬件中。其延迟极低的核心原因在于 硬件并行性、零拷贝架构 和 绕过…...
Flannel Host-gw模式的优缺点
Host-gw 模式的特点、优缺点 优点 高性能:无封装开销,数据包直接通过主机路由表转发,延迟和吞吐量接近原生网络。零额外开销:不使用隧道或封装,无额外字节,带宽利用率最高。配置简单:只需配置…...
SD-HOST Controller design-----SD CLK 设计
hclk的分频电路,得到的分频时钟作为sd卡时钟。 该模块最终输出两个时钟:一个为fifo_sd_clk,另一个为out_sd_clk_dft。当不分频时,fifo_sd_clk等于hclk;当分频时候,div_counter开始计数,记到相应分频的时候…...
zabbix最新版本7.2超级详细安装部署(一)
如果文章对你有用,请留下痕迹在配置过程中有问题请及时留言,本作者可以及时更新文章 目录 1、提前准备环境 2、zabbix7.2安装部署 3、安装并配置数据库 4、为Zabbix server配置数据库 5、为Zabbix前端配置PHP 6、启动Zabbix server和agent进程 7、关闭防…...
BFS算法篇——打开智慧之门,BFS算法在拓扑排序中的诗意探索(上)
文章目录 引言一、拓扑排序的背景二、BFS算法解决拓扑排序三、应用场景四、代码实现五、代码解释六、总结 引言 在这浩瀚如海的算法世界中,有一扇门,开启后通向了有序的领域。它便是拓扑排序,这个问题的解决方法犹如一场深刻的哲学思考&#…...
【Nova UI】十六、打造组件库之滚动条组件(中):探秘滑块的计算逻辑
序言 在上篇文章中,我们完成了滚动条组件开发的前期准备工作,包括理论推导、布局规划和基础设置。现在,我们将把这些准备转化为实际代码,开启滚动条组件的具体开发之旅🌟。我们会详细阐述如何实现各项功能,…...
题海拾贝:P1833 樱花
Hello大家好!很高兴我们又见面啦!给生活添点passion,开始今天的编程之路! 我的博客:<但凡. 我的专栏:《编程之路》、《数据结构与算法之美》、《题海拾贝》、《C修炼之路》 欢迎点赞,关注&am…...
集成钉钉消息推送功能
1. 概述 本文档详细描述了在若依框架基础上集成钉钉消息推送功能的开发步骤。该功能允许系统向指定钉钉用户发送文本和富文本消息通知。 2. 环境准备 2.1 钉钉开发者账号配置 登录钉钉开发者平台:https://open.dingtalk.com/创建/选择企业内部应用获取以下关键信…...
texlive 与 Texmaker 安装
一、安装 Texmaker 1、下载Texmaker 链接地址: Texmaker (free cross-platform latex editor) 点击 FREE DOWNLOAD ,点击 Texmaker_6.0.1_Win_x64.msi ,下载即可。 2、安装Texmaker 双击如下文件 若出现如下,点击更多信息 点击仍要运行 …...
Milvus(21):过滤搜索、范围搜索、分组搜索
1 过滤搜索 ANN 搜索能找到与指定向量嵌入最相似的向量嵌入。但是,搜索结果不一定总是正确的。您可以在搜索请求中包含过滤条件,这样 Milvus 就会在进行 ANN 搜索前进行元数据过滤,将搜索范围从整个 Collections 缩小到只搜索符合指定过滤条件…...
AD PCB布局时常用的操作命令
1. 框选 往右下方框选:选中矩形接触到的对象(选中整体才会被选中) 往左上方框选:选中矩形接触到的对象(选中局部,也是选中整体) 线选:快捷键S,弹出界面: …...
[免费]微信小程序医院预约挂号管理系统(uni-app+SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序医院预约挂号管理系统(uni-appSpringBoot后端Vue管理端),分享下哈。 项目视频演示 【免费】微信小程序医院预约挂号管理系统(uni-appSpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩…...
分析Docker容器Jvm 堆栈GC信息
# 打印jvm启动参数 docker exec -ti <容器名> jcmd 1 VM.flags-XX:CICompilerCount3 -XX:InitialHeapSize1073741824 -XX:MaxHeapSize2147483648 -XX:MaxMetaspaceSize157286400 -XX:MaxNewSize715653120 -XX:MinHeapDeltaBytes524288 -XX:NewSize357564416 -XX:OldSize7…...
Java——集合基础
一、集合与数组的特点对比 1.集合类的特点:提供一种存储空间可变的存储模型,存储的数据容量可以发生改变 2.集合和数组的区别 共同点:都是存储数据的容器不同点:数组的容量是固定的,集合的容量是可变的 3.如果存储…...
spark MySQL数据库配置
Spark 连接 MySQL 数据库的配置 要让 Spark 与 MySQL 数据库实现连接,需要进行以下配置步骤。下面为你提供详细的操作指南和示例代码: 1. 添加 MySQL JDBC 驱动依赖 你得把 MySQL 的 JDBC 驱动添加到 Spark 的类路径中。可以通过以下两种方式来完成&a…...
http断点续传
🛑 默认的 http.server(Python 的 SimpleHTTPRequestHandler)在某些版本和实现中并不可靠地支持 HTTP Range 请求(即断点续传)。 尤其在 Python 3.7~3.10 之间的某些版本中,这种支持是不完整或不可预测的。…...
# YOLOv3:基于 PyTorch 的目标检测模型实现
YOLOv3:基于 PyTorch 的目标检测模型实现 引言 YOLOv3(You Only Look Once)是一种流行的单阶段目标检测算法,它能够直接在输入图像上预测边界框和类别概率。YOLOv3 的优势在于其高效性和准确性,使其在实时目标检测任…...
Mac修改hosts文件方法
Mac修改hosts文件方法 在 macOS 上修改 hosts 文件需要管理员权限 步骤 1:打开终端 通过 Spotlight 搜索(Command 空格)输入 Terminal,回车打开。或进入 应用程序 > 实用工具 > 终端。 步骤 2:备份 hosts 文件…...
构建你的第一个简单AI助手 - 入门实践
在当今AI迅速发展的时代,构建自己的AI助手不再是高不可攀的技术壁垒。即使对于刚接触AI开发的程序员,也可以利用现代大语言模型(LLM)API构建功能丰富的AI助手。本文将带您完成一个简单但实用的AI助手构建过程,帮助您在日常工作中提高效率。 …...
Qt在统信UOS及银河麒麟Kylin系统中进行软件开发的环境配置,打包发布和注意事项
前述 之前由于项目的产品需要,必须将原本Windows上的产品移植到信创环境,也就是现在的主流国产操作系统统信UOS及银河麒麟Kylin。 先大概讲下信创系统: 信创系统就像是中国自己打造的 “数字基建”,目的是让咱们国家的信息技术不…...
一个完整的项目示例:taro开发微信小程序
前一周完成了一个项目,体测成绩转换的工具,没做记录,。这次计划开发一个地图应用小程序,记录一下。方便给使用的人。 一、申请微信小程序,填写相应的信息,取得开发者ID。这个要给腾讯地图使用的。 二、申…...
二次封装 el-dialog 组件:打造更灵活的对话框解决方案
文章目录 引言为什么需要二次封装?封装思路代码实现1. 基础封装组件 (Dialog.vue)2. Vue中引入使用示例 封装后的优势进阶优化建议 总结 引言 在 Vue 项目中,Element UI 的 el-dialog 是一个非常实用的对话框组件。但在实际开发中,我们经常会…...
3.2 一点一世界
第一步:引入背景与动机 “一点一世界”这个概念来源于泰勒公式的思想,即通过一个点及其导数信息来近似描述整个函数的行为。这种方法在数学分析中非常有用,因为它允许我们将复杂的函数简化为多项式形式,从而更容易进行计算和理解…...
力扣第156场双周赛
1. 找到频率最高的元音和辅音 给你一个由小写英文字母(a 到 z)组成的字符串 s。你的任务是找出出现频率 最高 的元音(a、e、i、o、u 中的一个)和出现频率最高的辅音(除元音以外的所有字母),并返…...
学习日志05 java
1 java里面的类型转换怎么做?int转double为例 在 Java 里,把int转换为double有自动类型转换和强制类型转换两种方式。下面为你详细介绍: 自动类型转换(隐式转换) 由于double的取值范围比int大,Java 能够…...
4.7/Q1,GBD数据库最新文章解读
文章题目:Burden of non-COVID-19 lower respiratory infections in China (1990-2021): a global burden of disease study analysis DOI:10.1186/s12931-025-03197-7 中文标题:中国非 COVID-19 下呼吸道感染负担(1990-2021 年&a…...
do while
先进再查 import java.util.Scanner;public class Hello {public static void main(String[] args) {Scanner in new Scanner(System.in);int number in.nextInt();int count 0;do{number number / 10;count count 1;} while( number > 0 );System.out.println(count…...
MySQL 主从复制与读写分离
一、MySQL 主从复制 (0)概述 MySQL 主从复制是一种数据同步机制,允许数据从一个主数据库(Master)复制到一个或多个从数据库(Slave)。其主要用途包括: 数据冗余与灾备:通…...
CSS3 基础知识、原理及与CSS的区别
CSS3 基础知识、原理及与CSS的区别 CSS3 基础知识 CSS3 是 Cascading Style Sheets 的第3个版本,是CSS技术的升级版本,于1999年开始制订,2001年5月23日W3C完成了CSS3的工作草案。 CSS3 主要模块 选择器:更强大的元素选择方式盒…...
第十七章:Llama Factory 深度剖析:易用性背后的微调框架设计
章节引导:在模型定制的实践中,Llama Factory (github.com/hiyouga/LLaMA-Factory) 以其惊人的易用性和对多种开源大模型、多种参数高效微调方法(PEFT)的广泛支持,迅速成为开源社区的热门选择。你可能已经熟练掌握了如何…...
SpringSecurity当中的CSRF防范详解
CSRF防范 什么是CSER 以下是基于 CSRF 攻击过程的 顺序图 及详细解释,结合多个技术文档中的攻击流程: CSRF 攻击顺序图 #mermaid-svg-FqfMBQr8DsGRoY2C {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#m…...
CSRF防范歪招
不保存到Cookie里呗 如果每次请求都强制通过请求头携带Token,并且不将Token存储在Cookie中,这种设计可以有效防御CSRF攻击。以下是具体原因和关键实现要点: 1. 防御原理 CSRF攻击的本质是攻击者伪造用户的请求,利用浏览器自动携…...
MyBatis与MyBatis-Plus深度分析
MyBatis与MyBatis-Plus深度分析 一、MyBatis原理与基础 1. MyBatis核心原理 MyBatis是一个半自动ORM框架,主要原理包括: SQL与代码分离:通过XML或注解配置SQL语句动态SQL:提供if、choose、foreach等标签实现动态SQL结果集映射…...
STM32 变量加载到flash的过程中
在STM32中,BIN文件内需要加载到RAM的数据由链接脚本(Linker Script)和启动代码(Startup Code)共同决定,具体机制如下: 一、BIN文件内容结构 STM32的BIN文件包含三类数据: Co…...
TCP核心机制
1. TCP五大核心机制 1.1. 顺序问题(稳重不乱) 背景:网络传输中数据包可能因路径不同或网络波动导致乱序到达,需保证接收方能按正确顺序处理数据。 原理: 序列号(Sequence Number)࿱…...
6.3对象序列化
在 Java 中,ObjectInputStream 和 ObjectOutputStream 是用于实现对象序列化(Serialization)和反序列化(Deserialization)的核心类。通过这两个类,可以将对象转换为字节流进行存储或传输,并在需…...
Flutter小白入门指南
Flutter小白入门指南 🚀 轻松构建漂亮的跨平台应用 📑 目录 一、Flutter是什么? 为什么选择Flutter?Flutter工作原理 二、环境搭建与命令行 安装Flutter SDK常用Flutter命令创建第一个项目 三、Flutter基础语法 变量与类型函数条…...
Python -将MP4文件转为GIF图片
给大家提供一个工具代码,使用Python,将MP4格式的视频文件,转换为GIF图片 首先先安装必要的包: pip install imageio pip install imageio[ffmpeg] 工具代码: import imageio# 视频文件路径 video_path r""…...