已关闭
[Requirement|需求建议]: 【社区任务】Sign算子支持int16实现贡献 #1525
hth810创建于  5月12日关闭于  6月30日
hth810
hth810
5月12日 创建

Thanks for sending an requirement! Please fill in the following template to help quickly solve your problem.

一、背景信息 (必填)

通过社区任务完成开源仓算子贡献的需求,补充完善 Ascend C Sign算子,为现有的 Sign 算子增加对 int16 数据类型的支持。

二、价值/作用 (必填)

Sign算子的主要功能是计算给定数值的符号:若元素值大于 0 则输出 1,小于 0 则输出 –1,等于 0 则输出 0,并生成结果张量 out。在数学与工程领域,Sign 运算是一种简洁而关键的符号判别操作,被广泛应用于稀疏化、梯度方向判断、特征编码等场景,可高效处理批量数值的符号计算,支持浮点数与整数输入。实现了Sign算子的AscendC实现,替代原有TBE算子在昇腾硬件上的适配。

三、设计方案 (必填)

3.1 使能方式(涉及哪些框架:如Aclnn直调、Pytorch训练等)

使用aclnn直调

3.2 总体设计
3.2.1 算子支持的数据类型
名称 类别 dtype format shape 介绍
x 输入 fp16/fp32/int32/bf16/int16 ND all 输入张量
y 输出 fp16/fp32/int32/bf16/int16 ND 同输入 符号位结果
3.2.2 host侧设计

1)分核策略

优先使用满核的原则。
如果核间能均分,可视作无大小核区分,大核小核数据块一致;
如果核间不能均分,需要将余出的数据块分配到前几个核上。
数据量当能单核处理的情况下使用单核,否者使用满核进行加速处理。

2)单core内切分策略
充分使用UB空间的原则。
需要考虑不同硬件的UB大小不同、是否开启double buffer、kernel侧API实现过程中是否需要临时数据的储存,综合考虑单核内切分的大小。

3)tilingkey规划策略
需要tilingkey的情况:需要感知host侧信息对kernel侧走不同分支。
不需要tilingkey的情况:host侧的处理是通用的,无特殊属性等决定kernel的分支

数据检测:
对不支持AscendC::Cast()bfloat16向float32转换的硬件进行直接在tiling策略时返回Get Operator Workspace failed. error code is 561002报错。

3.2.3 kernel侧设计

进行Init和Process两个阶段,其中Process包括数据搬入(CopyIn)、计算(Compute)、搬出(CopyOut)三个阶段。

将float16/float32使用AscendC:Sign计算,int32/int16使用AscendC:Mins,AscendC:Maxs计算。对于输入类型为bfloat16时,AscendC:Cast为float32计算。

3.3 支持硬件

Atlas A2 训练系列产品
Atlas A3 系列产品

3.4 算子约束限制

输入 x 和输出 y 的 Shape 必须严格保持一致。
💡 备注(选填)

likedislike
hth810
hth810
5月12日 评论:

/assign

likedislike
CANN-robotCANN-robot成员
5月12日 将 hth810 设为负责人
hth810hth810
5月12日 关联了pull request:【社区任务】AscendC实现Sign算子贡献
CANN-robotCANN-robot成员
6月30日 关闭了 issue
CANN-robotCANN-robot成员
6月30日 添加了label:resolved