当前位置: 首页 > web >正文

【AXI】读重排序深度

我们以DDR4存储控制器为例,设计一个读重排序深度为3的具体场景,展示从设备如何利用3级队列优化访问效率:


基础设定

  • 从设备类型:DDR4存储控制器(支持4个存储体Bank0-Bank3)
  • 读重排序深度:3(允许同时跟踪3个未完成读请求)
  • 访问延迟特征
    • Bank激活后访问:3周期(低延迟)
    • Bank预充电后访问:7周期(高延迟)
  • 主机请求序列(按时间顺序发送):
    时间点请求标识ARID值目标Bank地址描述
    T0Req A1Bank00x1000首次访问Bank0(需预充电)
    T1Req B2Bank10x2000Bank1已激活(低延迟)
    T2Req C3Bank20x3000Bank2已激活(低延迟)
    T3Req D1Bank00x1004连续地址(同ARID=1)
    T4Req E4Bank30x4000Bank3已激活(低延迟)

从设备处理逻辑(深度=3)

从设备内部有一个容量为3的请求队列,用于暂存未完成的读请求(pending addresses),允许对不同ARID的请求重排序,但严格保证同ARID的顺序。

阶段1:队列填充(T0-T2)
  • T0:接收Req A(ARID=1),队列为空 → 入队,开始处理Bank0预充电(耗时7周期)。
  • T1:接收Req B(ARID=2),队列剩余容量2 → 入队,立即处理Bank1(3周期完成)。
  • T2:接收Req C(ARID=3),队列剩余容量1 → 入队,立即处理Bank2(3周期完成)。

此时队列状态:[Req A(ARID=1), Req B(ARID=2), Req C(ARID=3)](已满)。

阶段2:队列释放与新请求(T3-T4)
  • T3:主机发送Req D(ARID=1),但队列已满(容量3),需等待至少一个请求出队才能入队。
  • T4:主机发送Req E(ARID=4),队列仍满,无法入队(需等待)。
阶段3:响应返回与队列更新(T4-T10)
  • T4(B完成):Bank1完成Req B → 返回数据B(RID=2),队列释放位置,Req D入队(ARID=1)。
  • T5(C完成):Bank2完成Req C → 返回数据C(RID=3),队列再释放位置,Req E入队(ARID=4)。
  • T7(A完成):Bank0完成Req A(预充电+访问耗时7周期)→ 返回数据A(RID=1),队列释放位置。
  • T8(D处理):Req D(ARID=1,目标Bank0)已激活(无需预充电)→ 3周期完成(T11返回数据D)。
  • T9(E处理):Bank3完成Req E(3周期)→ 返回数据E(RID=4)。

最终数据返回顺序

时间点返回数据原始请求说明
T4Data BReq B最早完成的低延迟请求(ARID=2)
T5Data CReq C次早完成的低延迟请求(ARID=3)
T7Data AReq A高延迟请求(ARID=1,必须先返回)
T9Data EReq E新入队的低延迟请求(ARID=4)
T11Data DReq D同ARID=1的后续请求(必须在A之后)

深度=3的核心优势

  1. 并行处理能力:同时跟踪3个未完成请求,允许从设备在Bank0(高延迟)处理期间,并行完成Bank1、Bank2的低延迟请求(T0-T5期间同时处理3个请求)。
  2. 资源利用率提升:原本需等待Bank0完成(T7)才能处理后续请求,但通过队列缓冲,T4-T5已释放两个位置,提前处理了Req D和Req E。
  3. 吞吐量对比
    • 严格顺序(深度=1):需依次处理A→B→C→D→E,总耗时≈7(A)+3(B)+3(C)+3(D)+3(E)=19周期。
    • 深度=3:实际总耗时≈11周期(T0-T11),吞吐量提升约42%。

关键约束验证

  • 同ARID保序:Req D(ARID=1)必须在Req A(ARID=1)之后返回(T11在T7之后)。
  • 跨ARID乱序:B、C、E(不同ARID)的返回顺序与请求顺序(B→C→E)无关(实际返回顺序B→C→E)。
  • 深度限制:队列容量3,T3-T4时因队列已满,Req D和E需等待队列释放后才能入队。

此例直观展示了读重排序深度为3时,从设备如何通过有限的乱序能力,在保证协议规范的前提下,显著提升存储访问效率。

http://www.xdnf.cn/news/15148.html

相关文章:

  • 在 Ubuntu 上安装和配置 Kafka
  • 【MSSQL】如何清理SQL SERVER内存解决内存占用高的问题
  • vivo Pulsar 万亿级消息处理实践(3)-KoP指标异常修复
  • Qt 信号槽的扩展知识
  • 新手向:实现ATM模拟系统
  • Java线程池原理概述
  • K线涨跌概率分析系统
  • 【双目深度估计】9种立体匹配算法整合包一键运行,支持相机标定、目标检测和tensorrt加速
  • 力扣61.旋转链表
  • 【WEB】Polar靶场 Day7 详细笔记
  • 北京-4年功能测试2年空窗-报培训班学测开-第四十六天
  • 高效集成-C#全能打印报表设计器诞生记
  • C++—拷贝构造函数
  • 深度学习模型表征提取全解析
  • SpringBoot mybatis
  • LeetCode经典题解:1、两数之和(Two Sum)
  • [2025CVPR]Mr. DETR:检测Transformer的多路由指导训练解析
  • SpringGateway网关增加https证书验证
  • Redis-哨兵选取主节点流程
  • 第4章:实战项目一 打造你的第一个AI知识库问答机器人 (RAG)
  • 数据库技术体系及场景选型方案
  • 【机器学习】BeamSearch算法
  • 10.9 大模型训练数据优化实战:3步让准确率从68%飙升至79%
  • 3、Unity免费插件整合
  • git入门之安装tortoisegit
  • UNet改进(19):基于残差注意力模块Residual Attention的高效分割网络设计
  • 三码合一:OneCode注解驱动的新时代编码范式
  • 【算法训练营Day10】栈与队列part2
  • TCP协议格式与连接释放
  • Python 机器学习核心入门与实战进阶 Day 7 - 复盘 + 综合实战挑战