From 5ddd8519f374b00d6aaab34db792b86e6f028efc Mon Sep 17 00:00:00 2001 From: admin Date: Tue, 25 Aug 2026 06:45:45 +0000 Subject: [PATCH] =?UTF-8?q?v0.91:=20=E8=A1=A5T=5Fbd=E8=AF=81=E6=8D=AE?= =?UTF-8?q?=EF=BC=88=E6=BA=90=E7=A0=81Set/Wait+=E7=9F=A5=E8=AF=86=E5=BA=93?= =?UTF-8?q?=E6=96=87=E7=8C=AE=E5=BC=95=E7=94=A8=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../BMM算子优化分析_v0.91.md | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/BMM算子优化分析_Release/BMM算子优化分析_v0.91.md b/BMM算子优化分析_Release/BMM算子优化分析_v0.91.md index b4b2bbf..5c09433 100644 --- a/BMM算子优化分析_Release/BMM算子优化分析_v0.91.md +++ b/BMM算子优化分析_Release/BMM算子优化分析_v0.91.md @@ -187,10 +187,35 @@ $$ **$T_{bd}$ 的物理成因**(batch 边界处硬件必须完成的固定动作): - 1. **Fixpipe 重配置**:每 batch 输出写往 GM 不同地址区域,fixpipe 需重配目标地址、步长等寄存器——每次排空的固定设置开销; - 2. **L0C 缓冲区切换握手**:L0C 双缓冲——Cube 往一半写、fixpipe 从另一半读。batch 边界处 Cube 须等 fixpipe 的 unitflag 确认已开始读当前半区,才能往另一半写新 batch 的部分和——同步握手有固定延迟; + 从 IterBatch 的 kernel 侧源码(`cmct/block/block_mmad_iterbatch.h`)可直接观察到 batch 边界的 Set/Wait 同步序列: + + ```cpp + // 当前 batch 最后一个 K 分块结束后: + SetFlag(l0cEventID_ & 0x1); // Cube → fixpipe: "L0C 可以排空" + WaitFlag(l0cEventID_ & 0x1); // 等 fixpipe 确认开始 ← 串行握手,不可掩盖 + CopyOut(cTensor, c1Local_[...]); // fixpipe 排空 L0C + SetFlag(l0cEventID_ & 0x1); // fixpipe → Cube: "L0C 已空" + // 下一 batch 第一个 K 分块: + WaitFlag(l0CEventID_ & 0x1); // 等 L0C 可用(被 L0C 双缓冲掩盖) + ``` + + $T_{bd}$ 由三个部分组成: + + 1. **Fixpipe 启动握手**(`WaitFlag`):fixpipe 从收信号到启动排空的延迟——地址/步长寄存器重配置(每 batch 输出写往 GM 不同区域)。**串行、不可掩盖**,是 $T_{bd}$ 的主要成分; + 2. **L0C 缓冲区切换**(`WaitFlag`):L0C 双缓冲——Cube 写一半、fixpipe 读另一半。被双缓冲掩盖,不贡献 $T_{bd}$; 3. **Cube 流水线重建**:systolic array 在新 batch 首个 K 分块时需重新填充——fill 开销与 tile 尺寸无关,是固定成本。 + **证据来源**: + + | 证据 | 文件 | 内容 | + |---|---|---| + | MMAD→Fixpipe 同步开销存在 | `CANN社区版9.2.0-beta.1/02_API参考/AscendC_API/180_..._UnitFlag.md` | "未开启UnitFlag功能时,MMAD和FIXPIPE是指令级别的同步……流水串行";实测 7.3% 改善(M=128,N=30720,K=64) | + | 同步指令是高开销指令 | `CANN社区版9.2.0-beta.1/01_AscendC算子开发/260_..._SIMT算子性能优化.md` | "除法、取模、**同步**、原子操作等都属于**高开销指令**" | + | 编译器默认插入同步指令 | `CANN社区版9.2.0-beta.1/01_AscendC算子开发/048_..._算子编译基本用法.md` | "默认会插入内存同步指令……这些同步指令**会带来性能开销**" | + | 同步机制是架构级关注点 | `00_硬件/昇腾950_NPU架构白皮书.pdf` §4.1.6 | 新增 BufferID 同步机制替代 set_flag/wait_flag——"降低了同步的复杂度" | + + $T_{bd}$ ≈ fixpipe 启动握手延迟(寄存器写入 + DMA 启动),量级估计为数十 ns。知识库未给出精确数值,需实测标定。 + 这些开销**与 batch 的计算量无关**,是每次 batch 切换的固定成本。大 batch 时被大量计算分摊,占比可忽略;小 batch 时每个 batch 绝对时延短,边界开销占比显著。MergeBatch 把 $b_0$ 个 batch 并为一次大矩阵计算,边界数降 $b_0$ 倍——**这是 MergeBatch 的结构性收益来源**。 **MergeBatch vs IterBatch 优势总结**: