已关闭
[Requirement|需求建议]: 个人-AscendC实现Sort算子贡献 #288
zhoujianhua创建于 2025年12月18日关闭于 3月31日
zhoujianhua
2025年12月18日 评论:
2025年12月18日 评论:
/assign


2025年12月18日 将 LePenseur 设为负责人
2025年12月18日 关联了pull request:个人-AscendC实现Sort算子贡献
1月27日 修改了issue 的描述
CANN-robot
3月18日 评论:
3月18日 评论:
CANN-robot
3月19日 评论:
3月19日 评论:
3月31日 关闭了 issue
3月31日 添加了label:resolved
Thanks for sending an requirement! Please fill in the following template to help quickly solve your problem.
一、背景信息 (必填)
使用AscendC对TBE实现的Sort算子进行重构,实现了AscendC实现的Sort算子对Atlas 200/500 A2推理产品和Atlas 800I/T A2硬件的适配。
二、价值/作用 (必填)
Sort算子的主要功能是对指定张量沿目标维度执行升序/降序排序(未指定维度时默认沿最后一维排序),可返回排序后元素的原索引;对于多维张量(暂时只支持二维),可指定任意有效维度执行排序,排序后保持张量原有形状不变。在数学和工程领域中,张量排序是数据处理与数值计算的核心操作,它被广泛应用于深度学习(模型训练中的TopK筛选、注意力机制权重排序、损失函数异常值过滤、批量数据标准化前的排序预处理)、数值分析(大规模矩阵的行列排序、特征值排序、数值稳定性验证、行列式计算前的矩阵规整)等多个领域。Sort算子能够高效处理不同维度(1D/2D)、不同数据类型(float16/float32)的张量排序,支持整型维度参数输入、布尔型排序方向(升序/降序),适配昇腾硬件的并行计算特性(利用昇腾NPU多核并行加速,大张量排序性能显著优于CPU)。实现了Sort算子的AscendC实现,替代原有TBE算子在昇腾硬件上的适配,兼顾排序效率与内存利用率,支持自动微分(梯度通过排序后的值反向传播到原张量),满足昇腾平台下深度学习框架(MindSpore/CANN)的算子调用需求。
三、设计方案 (必填)
3.1 使能方式(涉及哪些框架:如Aclnn直调、Pytorch训练等)
Aclnn直调
3.2 总体设计
3.2.1 算子支持的数据类型
float16、float两种数据类型。
3.2.2 host侧设计
Tiling分核策略:
dimH和宽度dimW。axis(排序轴)和descending(降序标志)。axis == 0(按列排序),则独立排序任务数为dimW(列数),单任务排序长度为dimH。axis == 1(按行排序),则独立排序任务数为dimH(行数),单任务排序长度为dimW。coreNum(硬件核心数)和独立任务数的较小值作为workCoreNum。workCoreNum个核心。smallCoreNum(小核数量)和bigCoreNum(大核数量)。smallCoreDataNum(小核处理任务数)和bigCoreDataNum(大核处理任务数,通常比小核多1)。sliceLen:实际需要排序的元素个数。realSortLen:满足Sort指令要求的 32 字节对齐长度(((sliceLen + 31) / 32) * 32)。align8:8 字节对齐长度。padLen:align8 - sliceLen,用于DataCopyPad的填充长度。dupCount:32 - align8 % 32,用于尾部额外填充的元素个数。SortV2TilingData结构体。3.2.3 kernel侧设计
进行 Init 和 Process 两个阶段,其中 Process 包括数据搬入(CopyIn)、计算(Compute)、数据搬出(CopyOut)三个阶段。
初始化(Init)
blockIdx = AscendC::GetBlockIdx()。startSlice和任务数量coreDataNum。coreDataStart:axis == 0,偏移为startSlice(列偏移)。axis == 1,偏移为startSlice * dimW(行偏移)。xGm、indexGm、yGm、dstIndexGm的全局缓冲区地址,指向当前核负责的数据段。realSortLen计算所需的 buffer 大小。inQueueX(输入数据与索引)、outQueueY(输出数据)、dstIndexQ(输出索引)、calcQ/tmpQ/concatQ(计算临时空间)。数据搬入(CopyIn)
dimH次,每次使用DataCopyPad搬运一个元素到xLocal和indexLocal的对应位置。DataCopyPad一次性搬运一行数据。DataCopyPad的padParams进行填充。descending属性决定:若降序则填充-FLT_MAX,若升序则填充FLT_MAX,确保填充值排在最后。dupCount > 0),使用Duplicate指令进行额外填充。计算流程(Compute)
inQueueX取出数据。Concat指令将数据按照Sort指令要求的格式进行拼接(concatRepeat)。!descending),调用Muls乘以 -1,将数值取反,从而利用硬件的降序排序能力实现升序。AscendC::Sort指令对数据和索引进行全排序。AscendC::Extract提取排序后的有效结果。Muls乘以 -1 恢复原始数值。outQueueY,索引放入dstIndexQ。数据搬出(CopyOut)
dimH次,使用DataCopyPad将yLocal和dstIndexLocal中的元素逐个写回全局内存的对应跨行位置。DataCopyPad将排序后的一行连续写回全局内存。3.3 支持硬件
Atlas 200/500 A2推理产品和Atlas 800I/T A2硬件
3.4 算子约束限制
💡 备注(选填)