Ascend 950 RM Target Selection
导言
已经知道组 WQE、敲 doorbell,接下来要弄清:如果同一个本地发送端点要向不同 rank 发送,每条 WQE 的远端目标在哪里设置? 本文沿 SHMEM 的 pe → remote_mem_info → WQE 追踪源码,再对照 elastic_dispatch.cpp。关键是分清本地队列、远端寻址元数据,以及 put/write 中容易被误读成 Jetty ID 的内存 tokenId。
Ascend 950 RM Target Selection
导言
已经知道组 WQE、敲 doorbell,接下来要弄清:如果同一个本地发送端点要向不同 rank 发送,每条 WQE 的远端目标在哪里设置? 本文沿 SHMEM 的 pe → remote_mem_info → WQE 追踪源码,再对照 elastic_dispatch.cpp。关键是分清本地队列、远端寻址元数据,以及 put/write 中容易被误读成 Jetty ID 的内存 tokenId。
导言
我是零基础的算子开发初学者。第一次面对混合了 C++、Ascend C、SIMT 和 SHMEM 的通信算子,难点并不只是某个 API 不认识,而是同一行里往往同时出现模板参数、地址空间、数据搬运和同步语义。我想迁移这样的文件,就需要先回答四个问题:数据在哪里、谁在执行、这一句改变什么、下一步何时能使用结果。
这篇文章从实际遇到的代码片段出发,把接口拆成尽量小的学习单元,再逐项解释模板参数、普通参数、返回值、地址偏移和同步范围。内容核对了 CANN 官方文档及 CANN/asc-devkit、CANN/shmem 公开源码。尚未取得原算子完整文件,因此不虚构原文件行号,也不把业务封装的推测写成 API 定义。 文中的示意代码用于理解语义,未在 NPU 上编译运行。
导言
理解“AIV 直驱缩短了通信控制路径”之后,下一步不是立即抄一个 AllGather,而是先闭合一条最小链路:Host 建立资源并分配对称内存,启动一个 AIV Kernel;Kernel 把数据写到对端并发布 signal;接收端等待 signal,最后 Host 确认完成并按依赖顺序销毁资源。
本文基于 cann/shmem@382afa08efa801d7bca6c2645fd17e155111efcc 和 CANN 9.0.X / 9.0.0-beta.2 官方文档。代码是绑定该 revision 的教学归一化代码,不是承诺可在任意 CANN 版本直接编译的通用样例。