已关闭
[Requirement|需求建议]: 【社区任务】Ascend C实现Neg算子贡献 #375
skywang2创建于  2025年12月30日关闭于  3月30日
skywang2
skywang2
2025年12月30日 创建

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

一、背景信息 (必填)

使用Ascend C对TBE实现的Neg算子进行重构。
实现算子适配Atlas 800I A2硬件。

二、价值/作用 (必填)

增加Ascend C实现的Neg算子,提升Ascend C算子的功能覆盖范围。

三、设计方案 (必填)

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

Aclnn直调

3.2 总体设计
3.2.1 算子支持的数据类型
算子类型(OpType)Neg
nameTypedata typeformat
算子输入 xtensor int32, int8, float16, bfloat16, float32ND
算子输出 ytensor 与输入相同ND
核函数名neg
  • 算子功能:Neg算子提供数值取负运算功能,对输入的数值型数据逐元素进行取负操作。
  • 计算公式:

y=xy=−x

3.2.2 host侧设计

tiling策略:
输入数据总量 → 评估UB容量 → 判断单核是否足够 →
├─ 是:单核策略(coreNum=1)
└─ 否:分核策略
├── 计算理论核心数
├── 与物理核心数取最小值
└── 大小核负载分配(处理余数数据)

1.分核策略
优先使用满核的原则。
根据块大小对输入数据的长度做对齐处理,基于对齐后的数据长度分别计算大、小核分配的数据块数,并保持核心间分配均衡。
2.单core内切分策略
充分使用UB空间的原则。
最大化利用UB空间,通过双缓冲技术和流水线设计隐藏数据搬运开销。UB空间按作用划分为输入缓存、输出缓存和临时缓存(如果数据类型是bfloat16),其中输入和输出缓存采用双缓冲机制,确保计算与数据搬运并行。Tile(每次compute函数计算的数据量)大小根据片上缓存容量和数据类型动态计算,每个核心的数据被划分为多个 Tile,对于最后可能包含尾数据的Tile单独进行处理。
3.tilingkey
tilingkey是否有尾块进行区分,有尾块为1,无尾块为0。

3.2.3 kernel侧设计

进行Init和Process两个阶段,其中Process包括数据搬入(CopyIn)、计算(Compute)、搬出(CopyOut)三个阶段。
Ascend C实现算子流程图如下:
Neg Compute函数流程图.png

3.3 支持硬件

Atlas 800I A2推理系列

3.4 算子约束限制

💡 备注(选填)

likedislike
Ggubaocheng成员
2025年12月30日 将 fullt 设为负责人
gubaocheng成员
2025年12月30日 评论:

Assign @fulltower

likedislike
skywang2skywang2
1月4日 关联了pull request:提交Ascend C实现的Neg算子
sunday成员
3月19日 评论:

/assign @fullt

likedislike
CANN-robot
CANN-robot成员
3月19日 评论:

Notice

This issue is already assigned to fullt. Please do not assign repeatedly.

likedislike
sunday成员
3月19日 评论:

/assign @fullt

likedislike
CANN-robot
CANN-robot成员
3月19日 评论:

Notice

This issue is already assigned to fullt. Please do not assign repeatedly.

likedislike
CANN-robotCANN-robot成员
3月30日 关闭了 issue
CANN-robotCANN-robot成员
3月30日 添加了label:resolved