[AI][昇腾950]TA 学习
TA(Transaction Layer,事务层)学习笔记
一、TA 在协议栈中的定位
UB 协议栈自顶向下四层:
Transaction(TA) → Transport(TP/CTP) → Network(NL) → DataLink+Physical(DL_PHY)
↓
H112 SerDes
TA 是最上层,面向软件,负责:
- JFS 队列调度、上下文维护
- WQE 拆解发送、RCE 回复 Rd Response / TAACK
- CQE / EQE 上报
- 超时检测、RNR 重传、Jetty 注销、Function 级复位
学习要点:TA 之下还有 TP(可靠传输)/ CTP(简易传输,无端到端重传)。TA 不直接碰链路,它把软件下发的"事务"交给 TP 去搬运。
二、三种编程接口
TA 为软件提供 三种 编程入口:
| 接口 | 用途 | 说明 |
|---|---|---|
| Mailbox | 控制面表项创建/修改/读取/注销 | |
| Doorbell | 通知硬件执行任务、更新指针、使能事件 | 分硬 DB(写地址空间 → TP LSAR → TA)与软 DB(record,软件写内存硬件读) |
| DirectWQE | 低延时直接下发 WQE | 64B 或 128B,不经 cache 访存 |
Doorbell 方向速记(软更 PI/CI 指软件维护的指针):
| 队列 | 软件维护 | 硬件维护 |
|---|---|---|
| JFS | PI | CI |
| JFC | CI | PI |
| JFR | PI | CI |
| EQ | CI | PI |
记忆:JFS/JFR 软件生产(PI),JFC/EQ 软件消费(CI)。
各队列对 DB 的支持:JFS 仅硬 DB;JFC 硬+软;JFR 仅软 DB;EQ 仅硬 DB。
三、Jetty / JFS / JFR / JFC 队列模型
3.1 核心概念
- Jetty:URMA 编程接口对象,绑定一对发送/接收队列
- JFS(Jetty For Send):发送队列
- JFR(Jetty For Receive):接收队列
- JFC(Jetty For Completion):完成队列,上报 CQE
3.2 关键规格
| 项 | 规格 |
|---|---|
| 每 Entity JFS/Jetty 数 | 最大 65536(64K) |
| JFS/Jetty 队列深度 | 1~32768(32K),2 的幂次方;深度 1/2/4 仅 Normal SQE |
| 每 Entity JFR 数 | 最大 65536 |
| JFR 队列深度 | 64~32768 |
| JFR RQE 大小 | 最大 4(单位 16B) |
| JFR RQE Buffer Size | 2KB/4KB,1 报文最多 4 RQE |
| Jetty Group 数 | 每 Entity 最大 65536 |
| Jetty Group 内最大 Jetty 数 | 32 |
| Jetty Group Hash | 按包头 Hint 选 JFR |
| JFC 队列数 | 最大 65536;1 JFC 绑多 JFS/JFR,1 JFS/JFR 属 1 JFC |
| JFC CQE 深度 | 64~1048576(1M) |
| JFC CQE 大小 | Normal 64B;Raw 固定 64B |
| JFC inline 模式 | Send/SendImm/SendInv 时 Payload 写入 CQE,最大 20B(带立即数减 8B) |
| JFC PA 地址 | 可 Bypass UMMU 降低 CQE 时延 |
学习要点:
- 1 JFC 绑多 JFS/JFR,但 1 JFS/JFR 只属 1 JFC(多对一关系)。
- JFC 可 Bypass UMMU 直接用 PA 地址,用于降低 CQE 时延。
四、URMA 操作语义
4.1 支持的操作
Send、Send with invalidate(仅软件方案)、Send with immediate data(CTP 最大 1 MTU)、Send with inline data(最大 208B)、Write、Write with immediate、Write with Notify、Write with Reduce(≤MTU)、Write with inline(最大 208B)、Read、Read with Reduce(≤MTU)、Compare&Swap Atomic(4/8/16B)、Fetch&Add Atomic(4/8B)、User Data 上报 CQE、NOP。
4.2 操作规格(Normal SQE)
| 操作 | 最小 | 最大 |
|---|---|---|
| Send | 0B(SGE_Num=0) | 可靠 TP 64KB;CTP 1 MTU |
| Write | 0B | 256MB(0x40000 KB) |
| Read | 0B | 256MB |
| Atomic CAS | 4B | 16B(操作数×2) |
| Atomic FetchAdd | 4B | 8B |
| Raw SQE Payload | 0B | 4KB |
| Write/Send inline | — | 208B |
4.3 WQE 切片规则
- Write/Read 可切片给 Transport,切片大小 = Payload size(不含包头)
- 可靠 TP 最大 65536(64KB),最小 1KB,2 的幂次方
- Send / Read Response / Raw / Atomic 不切片
- 无 TP 时按 MTU 拆
4.4 序模型
| 模型 | 说明 |
|---|---|
| No Order | 无序 |
| Strong Order | 强序 |
| Fence | 栅栏 |
| Relax Order | 宽松序 |
均在 WQE 中配置。
五、SQE 规格
- SQEBB(SQE Base Block)= 64B,是计量单位
- Raw SQE:最大 5 SQEBB;最大 18 SGE(每 SGE 16B);用于传统 NIC
- Normal SQE:最大 4 SQEBB;Write/Send 最大 13 SGE;Read 最大 6 SGE;Atomic 1 SGE
- JFS Context User Data:最大 8B 填入 CQE
记忆:64B 是基本块。Raw 给传统 NIC 用(5 BB / 18 SGE),Normal 是 URMA 主力(4 BB)。
SGE 是 Scatter/Gather Element(散集元素) 的缩写。它是一种用于描述非连续或离散内存数据段(Buffer)的结构单元,主要在传输请求WQE中指定数据的内存地址、长度和访问权限,从而支持高效的向量化 I/O 与零拷贝数据搬移。
SGE 的核心作用描述内存段:每个SGE 包含一段物理或虚拟内存的起始地址(Buffer Address)以及数据长度(Length)。
SGL:多个 SGE 可以组合成一个散集列表(Scatter/Gather List, SGL),用来一次性处理分布在内存中不同位置的多个数据块。
-
SGE 的核心字段(硬件数据结构)在硬件底层,一个 SGE 通常占用 16 字节(Bytes) 或 32 字节 的固定内存空间,主要由以下三个核心核心字段组成:
- Addr (64-bit 地址):指向本段内存缓冲区的起始虚拟地址(VA)或物理地址。
- Length (32-bit 长度):指定该内存段的大小(以字节为单位),定义了硬件可以读取或写入的边界。
- Lkey (32-bit 局部密钥):这是硬件进行内存保护的核心机制。它是该内存区域在注册(Memory Region, MR)时生成的令牌。硬件通过检查 Lkey 来验证当前进程是否有权限读写该段内存,防止非法内存越界。
-
SGE 的组织与执行形式:WQE ↔ SGL ↔ SGESGE
它是通过工作队列(Work Queue)和散集列表(SGL)来协同工作的:软件提交(Gather / 发送端):软件(如应用层或网络协议栈)要发送 3 块不连续的数据。软件构建一个 WQE(工作队列元素),并在 WQE 内部包含一个由 3 个 SGE 组成的 SGL(Scatter/Gather List)。
六、RC 表(Remote Command 表)
存收到的远端 Read / Atomic 请求;RM 模式需回 TAACK 的 Write/Send 也用。
| 项 | 规格 |
|---|---|
| 每 Entity RC 表数 | 最大 65536,可配置(每 VL 2 的幂次方深度) |
| RC 表大小 | Ring Buffer,RCE BB 固定 64B;单命令占 1+ RCE BB;最小 64B,最大 128B(2 RCE) |
| RC 表深度 | 64 ~ 32768 RCEBB |
| 拥塞反馈 | RC 表达水线返回拥塞指示,源端降速(解除活锁,非协议拥塞控制) |
学习要点:RC 表是"接收侧"用来暂存远端发来的 Read/Atomic 请求的环形缓冲。达水线会反压源端降速——注意这是解除活锁,不是协议级拥塞控制。
七、Direct WQE / WQE Lock Buffer / Stars Lock Buffer
7.1 DirectWQE 机制
硬件收到 DirectWQE 后,按 Jetty 范围判断存入:
- Stars Lock Buffer
- WQE Lock Buffer
- WQE cache
Lock Buffer 模式下 SQE 只存片上,无访存,DSQE 源保证不溢出(低延时场景)。
7.2 WQE Lock Buffer
- XPU(CPU/CCU/AIV/AICPU)下发的 DirectWQE 存入
- 使用此 Buffer 的 Jetty 仅支持 DirectWQE,不支持 doorbell
- FE 内连续 Jetty 范围,静态配置(start_jetty_id / end_jetty_id),所有 FE 范围相同
- 每 FE 配 1bit 使能 + fe_start_buf_idx;FE 内 jetty 深度相同(2^bb_shift,最大 2^12)
- 片上容量 4K×64B
- JFS context 中
wqe_lock_buffer_en=1时 sqe_base_addr 为此 Jetty 在 Buffer 起始地址
地址计算:
addr = fe_start_buf_idx + (jetty_id - start_jetty_id)*(2^bb_shift) + sqebb_idx%(2^bb_shift)
- 64B DWQE:sqebb_idx = DWQE.sqe_bb_idx - 1
- 128B DWQE:第 1 个 sqebb_idx = sqe_bb_idx-2,第 2 个 = sqe_bb_idx-1
7.3 Stars Lock Buffer
- 深度 128×64B
- 与 WQE Lock Buffer 的 Jetty 范围不交叠
学习要点:DirectWQE 是低延时关键路径。Lock Buffer 把 SQE 留在片上免访存,但要付出"Jetty 范围受限、不支持 doorbell"的代价。
八、Write with AtomicStoreAdd
| 模式 | opcode | 结构 | 说明 |
|---|---|---|---|
| 单 WQEBB | 0x19 | 仅 1 SGE,1 WQEBB;EID 32bit,TokenValue 24bit;不支持 UDF | Payload 最大 64KB(TP)/ 4KB(CTP,≤MTU);inline 最多 8B;TA 不切片发 TP;sge_num=0 表 payload=0 |
| 两 WQEBB | 0x1A | 数据结构同 write with notify;1 SGE(sge_num=0/1) | inline 最多 16B;TP 0~64KB / CTP 0~4KB;TA 固定不切片,超切片大小不发送上报 AE |
九、流量管理 TM 4 层调度
| 层级 | 节点 | 典型数量 | 调度 | Shaper |
|---|---|---|---|---|
| L5 | Queue (Q) | 128 | — | — |
| L4 | Queue Set | 128 | 固定一一映射 L5 | 单桶 1Mbps~200Gbps,精度 1% |
| L3 | Function (VF/PF) Entity | 64 | 最多 16 L4 → 1 L3,SP+DWRR | 双桶 CIR/PIR |
| L2 | Function Group | 16 | 最多 8 L3 → 1 L2,SP+DWRR | 双桶 |
| L1 | Network Port | 1 | 32 FG → 1,SP+DWRR | 单桶 |
- Jetty 流量控制最低 1Mbps
- SL→VL 映射表,同 FE 同 VL SQ 映射到同 FE+VL Queue
学习要点:自底向上 L1(端口)→ L2(FG)→ L3(FE)→ L4(QS)→ L5(Q)。调度算法 SP(严格优先级)+ DWRR(加权轮询)组合。L3/L2 用双桶(CIR/PIR),L1/L4 用单桶。
十、性能指标
10.1 昇腾场景
| 操作 | RC 单向 | RC 双向 | RM 单向 | RM 双向 |
|---|---|---|---|---|
| Send/Rcv | 快 | 最快 | 慢 | 快 |
- CTP 模式 4KB 打满
- 带宽场景:10 Jetty 对 10 Port,4KB 打满
- context cache miss 时双向包率之和 80Mmps
- 达成条件:JFS 32~384,RC 32~64,单 Jetty WQE≥4,CQE 非 inline,4KB 打满带宽,≤1KB 打满包率
学习要点:RC 比 RM 快约 2 倍。Cache hit/miss 对带宽影响巨大。
十一、图速记
软件 ──Mailbox──▶ [表项配置] ──IMP──▶ TA
──Doorbell──▶ [PI/CI更新] ──TP LSAR──▶ TA
──DirectWQE─▶ [低延时] ──┬─ Stars Lock Buffer (128×64B)
├─ WQE Lock Buffer (4K×64B, 昇腾)
└─ WQE cache
TA 内部:
JFS(发送) ──SQE──▶ [拆解/切片] ──▶ TP ──▶ NL ──▶ DL_PHY
JFR(接收) ◀──RQE── [收报文] ◀── TP
RC表(远端命令暂存) ──RdResp/TAACK──▶
JFC(完成) ──CQE──▶ 软件
EQ(事件) ──EQE──▶ 软件
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐

所有评论(0)