CANN SHMEM Primitives

导言

我是零基础的算子开发初学者。第一次面对混合了 C++、Ascend C、SIMT 和 SHMEM 的通信算子,难点并不只是某个 API 不认识,而是同一行里往往同时出现模板参数、地址空间、数据搬运和同步语义。我想迁移这样的文件,就需要先回答四个问题:数据在哪里、谁在执行、这一句改变什么、下一步何时能使用结果。

这篇文章从实际遇到的代码片段出发,把接口拆成尽量小的学习单元,再逐项解释模板参数、普通参数、返回值、地址偏移和同步范围。内容核对了 CANN 官方文档及 CANN/asc-devkit、CANN/shmem 公开源码。尚未取得原算子完整文件,因此不虚构原文件行号,也不把业务封装的推测写成 API 定义。 文中的示意代码用于理解语义,未在 NPU 上编译运行。

Read more

AIV UDMA Direct Drive

导言

刚理解 WQE 时,我看到一份 MoE dispatch 头文件没有调用 aclshmemx_udma_put_nbi(),也没有在发送热路径调用 aclshmemx_udma_quiet()。第一反应是:它是不是用 SIMT 加速了 WQE 下发,又用 Data-as-Flag 代替了完成通知?本文先沿标准接口追踪 Tensor 如何被降成地址、长度与 WQE,再把它与头文件中的批量直驱实现逐项比较。最后得到的边界是:SIMT 加速的是提交,Data-as-Flag 加速的是接收端就绪判断;二者都没有让 UDMA、SQ/CQ 生命周期或源 buffer 完成语义消失。

Read more

Ascend DeepEP Dispatch Code Walkthrough

导言

阅读 4357 行 deepep_moe_dis_dispatch.h 时,最大的困难不是找到某个函数,而是持续维护 E2E 阶段、函数调用和具体源码行之间的对应关系。静态长文适合建立概念框架,却不便于在多条并行执行路径之间反复定位。

本页将同一份 Ascend C 参考实现组织为三轨联动工作区:左侧展示 Full-Mesh dispatch 的端到端执行 DAG,中间拆解当前函数的调用和分段逻辑,右侧保留完整源码。读者可以从阶段进入函数、从调用跳转到被调函数,也可以通过搜索和行号反向追踪同步协议与数据流。

Read more

Ascend DeepEP Ref Dispatch SIMT

导言

MoE dispatch 的困难并不只是把 token 从一张卡搬到另一张卡,而是要在 Top-K 路由运行时才确定的前提下,同时解决槽位分配、跨核协作、远程写入、完成通知和接收端连续排布。如果只盯着某个拷贝循环,很容易忽略控制面和同步协议才是这份实现的骨架。

本文以 deepep_moe_dis_dispatch.h 的 4357 行 Ascend C 参考实现为对象,从 SIMT 线程模型和 Full-Mesh 通信窗讲起,沿“本地打包 → 生成并提交 URMA WQE → doorbell 触发 → flag/count 对账 → 前缀和定位 → 输出重排”还原完整执行路径。页面把关键函数、内存布局、时序约束和可验证的优化方向放到一张连续地图中,帮助初学者建立从源码行号到通信机制的对应关系。

Read more