7月社区任务-MatmulGatherScatter算子开发任务书
【免费下载链接】cann-ops-competitions本仓库用于 CANN 开源社区各类竞赛、开源课题、社区任务等课题发布、开发者作品提交和展示。项目地址: https://gitcode.com/cann/cann-ops-competitions
基础信息
- 技术标签:算子开发
- 适配硬件:Ascend 950PR/Ascend 950DT
- 开源仓地址:https://link.gitcode.com/i/856c62aae5d86f4af2db7b738a9f625e
- CANN 版本:算子开源仓指定版本
- 开发语言:Ascend C
任务概述
本算子实现融合 Gather/Scatter 的矩阵乘法(Matmul with Gather/Scatter Fusion)。通过索引向量从 A 矩阵中 Gather 出指定行的子集参与 Matmul 计算,然后将计算结果通过同一索引向量 Scatter 写回 D 矩阵的对应行。该融合方式适用于推荐系统等需要对稀疏特征行进行 gather 后做矩阵乘的场景。
算子公式
$$ \mathbf{D}[\text{indices}[i], j] = \sum_{k=0}^{K-1} \mathbf{A}[\text{indices}[i], k] \cdot \mathbf{B}[k, j] $$
等价向量化形式:$\mathbf{D}[\text{indices}, :] = \mathbf{A}[\text{indices}, :] \times \mathbf{B}$
D 的其他行(不在 indices 中的位置)保持为零。输出矩阵 D 需先做置零初始化。
核心开发要求及验收标准
功能实现要求
- 实现融合的 Gather A(按行)+ Matmul + Scatter D(按行),单次 kernel launch 完成全部计算。
- 索引向量由调用方保证不重复、在合法范围内,算子端不做校验。
- Gather A 和 Scatter D 使用同一索引向量。
- 输出 D 需先置零,仅索引行被写入。
参数说明
| 参数名 | 输入/输出/属性 | 描述 | 使用说明 | 数据类型 | 数据格式 | 维度(shape) | 非连续Tensor |
|---|---|---|---|---|---|---|---|
| A | 输入 | Matmul 左矩阵,形状 (M, K) | 按 indices gather 行,RowMajor 布局 | FP16 | ND | 2 | — |
| B | 输入 | Matmul 右矩阵,形状 (K, N) | RowMajor 布局 | FP16 | ND | 2 | — |
| indices | 输入 | 行索引向量,长度 J | 元素为 [0, M-1] 的不重复整数 | INT32 | ND | 1 | — |
| D | 输出 | Matmul 输出矩阵,形状 (M, N) | RowMajor 布局,仅 indices 行被写入,其余保持 0 | FP16 | ND | 2 | — |
算子约束限制
- 无
测试标准
需参考 CPU 精度标杆自行设计自验证用例,覆盖不同 index_size 比例、多种问题规模。需额外验证非索引行保持为零。自验证报告完整、可复现,所有测试用例执行通过。
性能要求
性能标杆为CUTLASS的36_gather_scatter_fusion,算子整体性能需与 0.8 倍 GPU(H100)持平。
精度要求
算子计算精度需满足 AscendOpTest 工具默认阈值。
文档规范要求
- 算子设计文档需根据参考模板填写,内容完整、格式规范,且必须通过评审;
- 自验证报告需要覆盖所有功能场景,参考xxx算子自验证报告,含测试用例执行日志/截图、整体测试通过截图、性能数据截图,可清晰指导算子使用与测试;
- README 文档内容完整、规范。
验收交付件
1, 自测用例、测试结果报告、测试步骤指导文档
2, 算子代码的私仓邀请链接、代码仓路径、分支、算子目录
PR 申请合入
测试通过后,在 Catlass 代码仓提交 PR 申请,申请将开发完成的算子合入https://link.gitcode.com/i/856c62aae5d86f4af2db7b738a9f625e,具体目录参考该PR:https://link.gitcode.com/i/856c62aae5d86f4af2db7b738a9f625e/pull/678 。
参考资料
- 文档类:Ascend C算子开发文档、CATLASS创新样例开发流程指南
- 课程类:Ascend C在线课程
- 参考样例:https://link.gitcode.com/i/856c62aae5d86f4af2db7b738a9f625e/blob/master/examples/44_quant_matmul_full_loadA_tla
环境获取
开源仓提供100小时免费时长,请不使用时及时关闭,用时耗尽前请务必保存相关资料,建议及时提交备份。
使用 hidevlab notebook 算力(https://hidevlab.huawei.com/online-develop-intro?from=hiascend)
如需额外环境资源,请联系昇腾小助手。
特别注意事项
- 开发过程需严格遵循 Ascend C 编程规范及算子开发相关要求;
- 所有交付件需提前完成自验证,确认符合验收标准后再提交验收申请;
- 开发前请务必阅读【社区任务】流程及注意事项,会例行更新。
【免费下载链接】cann-ops-competitions本仓库用于 CANN 开源社区各类竞赛、开源课题、社区任务等课题发布、开发者作品提交和展示。项目地址: https://gitcode.com/cann/cann-ops-competitions
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考