已关闭
【社区任务】MatmulGatherScatter算子贡献 #391
Delicate02创建于 8月3日关闭于 5 天前
8月3日 关联了pull request:[feat]补充77_ascend950_matmul_gather_scatter样例
8月3日 修改了issue 的描述
8月12日 添加了label:requirement
longjihui
5 天前 评论:
5 天前 评论:
需求已闭环,详见关联PR


5 天前 issue状态由 进行中 改变为 已完成
5 天前 关闭了 issue
5 天前 添加了label:resolved
Thanks for sending an requirement! Please fill in the following template to help quickly solve your problem.
Backgroud / 背景信息
需求背景
需求来源
7 月社区任务
MatmulGatherScatter算子开发任务书,要求在 CATLASS 仓中实现 Ascend 950 上的 Gather、Matmul、Scatter 融合算子,并补充 optest 测试交付件和 README。任务书:https://gitcode.com/cann/cann-ops-competitions/blob/master/04_tasks/01_community-task-2026/docs/202607/MatmulGatherScatter_task_doc.md
背景介绍
MatmulGatherScatter 算子实现优化
推荐系统和稀疏特征计算通常只需要更新稠密矩阵中的部分行。任务基线由
torch.zeros初始化、Gather、torch.mm和 Scatter 小算子拼接完成,需要多次 kernel launch,并会将 Gather 结果(J,K)和 Matmul 结果(J,N)写入 GM 后再被后续算子读取。本需求基于 CATLASS 和 Ascend C 实现单次 MIX kernel 融合,在片上完成 D 清零、按行 Gather、Cube Matmul 和按行 Scatter,减少中间 GM 读写和多算子下发开销。
MatmulGatherScatter 算子实现现状分析
算子输入输出如下:
(M,K)(K,N)(J,)(M,N)MatmulGatherScatter 算子功能分析
先从 A 中按 indices 取出逻辑左矩阵:
再计算矩阵乘:
最后使用同一 indices 写回 D:
D 中不在 indices 内的其他行保持为零。等价向量化形式为:
需求分析
需求描述
使用 CATLASS/Ascend C 实现 Ascend 950 上的 FP16 RowMajor
Gather A + Matmul + Scatter D融合算子。算子需在单次 kernel launch 内完成输出清零、Gather、Matmul 和 Scatter,输出与 PyTorch 参考实现保持一致,并在 Ascend 950PR 上达到任务测试集小算子拼接 baseline 的整体 1.2 倍性能目标。需求拆解
A(M,K)、B(K,N)和indices(J),数据类型分别为 FP16、FP16 和 INT32。D(M,N),数据类型为 FP16,布局为 RowMajor。(J,K)或(J,N)GM 中间张量。msprof op逐项采集,并与任务测试集提供的 baseline 对比。详细设计
算子分析
数学公式
输出定义为:
逻辑 Matmul 的问题规模为
(J,N,K),A 和 D 的物理行数为 M。Gather 源行地址使用物理 K 作为行跨度,Scatter 目标行地址使用物理 N 作为行跨度。支持数据类型
(M,K)(K,N)(J,)(M,N)支持形状
M > 00 < J <= MN > 0K > 0,当前实现要求为 16 的倍数[0,M-1]且互不重复算子实现
Host 侧设计
Host/JIT 侧完成输入约束检查、输出申请、硬件同步地址获取、调度参数选择和 MIX kernel launch:
M/J/N/K,检查输入 dtype、设备、连续 RowMajor 布局和形状关系。aclrtGetHardwareSyncAddr获取全核同步地址,并通过 kernel 参数传入。(1 AIC, 2 AIV)使用全部 28 个 Cube Core 和 56 个 Vector Core。新增 numbered example
79_ascend950_matmul_gather_scatter,公开 Python 接口为:Kernel 侧设计
Kernel 采用 AIC/AIV 协同执行:
M*N输出区域分片清零;满足容量和规模条件时,只清零未被选中的连续行段。(TileM,K)沿 K 维完整驻留 L1,并在多个 N tile 间复用。D[indices[row], nOffset]Scatter 写回。Gather 与调度策略
当前设计按 shape 特征选择稳健路径,而不是为每个测试 case 写逐项特判:
K<=512K=768K>=2048当
J>TileM时优先使用 FullLoadA 调度,使同一 J tile 的多个 N tile 尽量在同一 AIC 连续执行并复用 L1 A;小 J 场景展开 N tile 到多个 AIC,避免并行度不足。性能优化策略
支持硬件
算子约束限制
J <= M。可维可测分析
精度标准与性能标准
zeros + index_select + matmul + index_copy参考实现满足生态算子开源精度标准,未索引行严格为零torch.zeros + gather + torch.mm + scatterbaseline 的 1.2 倍性能采集使用
msprof op,任务测试集全部 180 个 case 逐项记录 fused 时间、baseline、speedup 和实际调度配置;涉及 Gather 方案、TileShape 或 stage 调整时备注实验条件和选择结论。兼容性分析
该需求以独立 numbered example、CATLASS kernel/tile helper 和 optest 接口接入,不改变已有公开算子语义。新增注册项仅用于
ascend950_matmul_gather_scatterJIT/optest 路径;已有 CATLASS 示例和 optest 接口不受影响。