公司动态
CANN/cannbot-skills:DataCopyPad紧凑搬入实现
实现②DataCopyPad 紧凑搬入外层广播offset 寻址【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills主文档broadcast_design.md | 参考代码code/broadcast_common.hDataCopyPadCompact思路当广播轴**全部位于切分轴之上外层循环轴**时UB tile 内数据连续、无需复制。广播由GM offset 算术实现外层广播轴stride0GetGmOffset在这些轴推进时给出同一段 GM 偏移于是每个 tile 用普通DataCopyPad搬一段连续数据即可广播体现在不同输出 tile 指向相同输入区。适用广播轴全在切分轴之上brcInTile false、切分轴本身连续。同 ① 一样不占 Vector且比 ① 更省——连 DMA 的 in-tile 复制都不需要纯连续搬。② 与 ①共用同一段 kernelBroadcastNddma内outputStrides[ubSplitAxis] inputStrides[ubSplitAxis]切分轴非广播、tile 内无需复制时自动落入DataCopyPadCompact。Kernel 写法// 节选完整见 code/broadcast_add_kernel.cpp if (td_.brcMode[i] BRC_DATACOPYPAD) { int64_t off GetGmOffset(axes, inputStrides[i], ubSplitAxis, ubFormer); // 外层广播轴 stride0 → off 复用 int64_t len rows * inputStrides[i][ubSplitAxis]; // 切分轴非广播lentile DataCopyPadCompact(yGm[off], dst, len); // 每轮搬正确且安全 }紧凑搬入DataCopyPadCompactcode/broadcast_common.hAscendC::DataCopyExtParams ext{1, (uint32_t)(lenEle * sizeof(T)), 0, 0, 0}; // blockCount1连续一段 AscendC::DataCopyPad(ub, gm, ext, pad); // lenEle 可非 32B 对齐关于复用可选优化本样例未启用早期版本想靠不重搬 复用上轮 buffer省搬运但判据不能用切分轴 stride② 路径下切分轴恒非广播inputStrides[ubSplitAxis] ! 0该判据永远要求重搬复用分支是死路径并不省。正确的复用判据是「本输入 GM offset 与上一轮相同」——即本轮只推进了外层广播轴stride0、切分轴未变。此时上轮 UB 内容仍有效可复用。注意DoubleBuffer 复杂性depth2 的 TQue 每轮交替返回 ping/pong 两块。复用需按 buffer 槽位分别记录该槽当前持有哪个 offset 的数据仅当目标槽已持有当前 offset 才跳过搬运。简单做法是给该广播输入改用单块TBuf非 ping-pong自行管 MTE2→V 同步。收益有限多搬几次连续数据是安全的不影响正确性仅多占 MTE2。入门样例选择每轮都搬把复用留作 profiling 确认 ② 的搬运成为瓶颈后再加的优化。注意② 的广播完全靠inputStrides的 0 与GetGmOffsetkernel 里不需要任何广播指令或 DMA 复制。len用真实元素数含非对齐尾块DataCopyPad自动 pad无需手动处理。若要做复用优化复用 buffer 不能与每轮重写的输入共用且判据用 offset 比较而非切分轴 stride。【免费下载链接】cannbot-skillsCANNBot 是面向 CANN 开发的用于提升开发效率的系列智能体本仓库为其提供可复用的 Skills 模块。项目地址: https://gitcode.com/cann/cannbot-skills创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考