已合并
[Requirement|需求建议]: 【社区任务】Relu算子新增INT16数据类型支持 #6387
cxj01创建于 6月23日
[Requirement|需求建议]: 【社区任务】Relu算子新增INT16数据类型支持 #6387
已合并
Pull Request已成功合入, 合并人@CANN-robot
(感谢 cxj01 的贡献)6月23日 添加了label:cann-cla/yes
CANN-robot
6月23日 评论:
6月23日 评论:
Thanks for your pull-request.
The full list of commands accepted by me can be found at here.
You can get sig-info at here.
For more, you also can visit HICANN.
PR Approval Progress
✅ Congratulations! All modules have met the lgtm and approve requirements.
Module Approval Details
| module | lgtm status | approve status |
|---|---|---|
| experimental | ✅ 傅涛, 任如海 (2/2) | ✅ 傅涛 (1/1) |
💡 Tip:
- Committer can comment
/approveor/lgtm- Commenting
/approveimplies both code review (lgtm) and intent to merge (approve)
CLA Signature Pass
cxj01, thanks for your pull request. All authors of the commits have signed the CLA. 👍


此处折叠了447条消息 查看更多
14 天前 添加了label:lgtm
14 天前 关闭了关联的issue
14 天前 合入了pull request
CANN-robot
14 天前 评论:
14 天前 评论:
Pull Request 已合并或已关闭。
If you want to solve this problem, you can click here to do it in the FAQs.


描述
Relu算子设计文档
一、需求背景
1.1 需求来源
参考昇腾版本内置aclnnRelu算子的TBE实现,在昇腾NPU上基于Ascend C编程语言实现功能一致的算子,并扩展支持int16数据类型。
1.2 背景介绍
1.2.1 Relu算子实现优化
ReLU(Rectified Linear Unit)数学表达式:
ReLU(x)=max(0,x)={x,0,x>0x≤0
1.2.2 Relu算子现状分析
1.2.2.1 TBE算子支持的数据类型
FLOAT、FLOAT16、INT8、INT32、INT64、BFLOAT161.2.2.2 TBE算子实现描述
TBE算子核心逻辑(路径:
/usr/local/Ascend/ascend-toolkit/latest/opp/built-in/op_impl/ai_core/tbe/impl/ops_legacy/relu.py):TBE ReLU 是逐元素单输入单输出算子,无广播、归约及跨元素依赖,实现流程如下:
参数校验:通过para_check校验输入、输出、kernel_name 合法性,同时校验输入数据类型是否在白名单(float16/float32/int8/int32/bfloat16/int64)内;
动态 Shape 分类:按逐元素模式对动态 shape 输入分类;
张量构造:获取动态 shape,用tvm.placeholder构建输入张量;
核心计算分支:
特殊场景:res_conv2d/dequant_remove_pad输入 + 平台支持tik.vcopy+ 非 int64 → 调用tbe.vlrelu(x, 0);
类型适配计算:
int8 + 平台支持s82f16:先转 float16 计算,结果转回 int8;
bfloat16:先转 float32 计算,结果经tbe.round转回 bfloat16;
常规场景:平台支持对应 dtype 的tbe.vrelu→直接调用;否则构造全 0 张量,用tbe.vmax(x, 0)实现;
编译生成:自动生成调度,编译输出可执行 kernel。
TBE算子实现策略
vlrelu(x, 0)vrelu(x)vmax(x, 0)1.2.2.3 TBE算子实现流程图
二、需求分析
2.1 外部组件依赖
不涉及外部组件依赖。
2.2 内部适配模块
适配Aclnn接口,支持常规调用和原位调用两种模式。
2.3 需求模块设计
2.3.1 AscendC算子原型
2.3.2 AscendC算子相关约束
三、需求详细设计
3.1 使能方式
3.2 需求总体设计
3.2.1 host侧设计
3.2.1.1 分核策略
3.2.1.2 数据分块和内存优化策略
UB容量适配:根据数据类型计算bufferCoefficient
内存对齐:按32字节对齐tile大小,Cache Line对齐(512字节)分配Core任务
3.2.1.3 tilingKey规划策略
将tiling参数(formerNum、formerLength、tailLength、tileLength)封装到ReluTilingData结构体中。
3.2.2 kernel侧设计
3.2.2.1 kernel侧实现描述
Relu算子kernel侧采用模板化设计,针对不同数据类型实现3种Kernel类:
x = (high_32 << 32) | low_32,其符号仅由high_32的最高位决定:所有Kernel类共享基类KernelReluBase,实现通用的数据搬运和流程控制。
3.2.2.2 AscendC实现流程图
int64子流程:

3.2.2.3 AscendC实现流程图与TBE流程图存在的差异点和原因
3.3 支持硬件
3.4 算子约束限制
四、特性交叉分析
本算子为独立激活函数算子,不涉及与其他算子的特性交叉。
五、可维可测分析
5.1 精度标准/性能标准
精度标准:
性能标准:
5.2 兼容性分析
关联的Issue
关联Issue #3495
测试
进行AscendOpTest测试。
文档更新
类型标签