已关闭
【社区任务】floor_div算子设计文档 #197
leozxw创建于 2025年11月11日关闭于 3月20日
【社区任务】floor_div算子设计文档 #197
已关闭
leozxw创建于 2025年11月11日关闭于 3月20日
leozxw
leozxw
2025年11月11日

描述

背景信息

基于FloorDiv算子历史TBE版本使用Ascend C编程语言进行优化。

TBE源码分析

通过对RealDiv算子TBE版本的功能分析,当前支持的能力如下:

  1. self, other支持float32,float16,int32,int8,uint8,bfloat16,int64七种格式的输入,任务书说明:暂可不支持int64类型 。
  2. FloorDiv算子涉及到对输入数据进行广播(输入数据的shape调整到相同大小),任务书说明:暂可不支持广播场景
  3. 在对输入数据进行广播操作后,调用floor、vdiv和cast接口实现相应的表达式:

For float16、float32:

out=selfotherout=\lfloor \frac{self}{other} \rfloor

For float32、int32、int8、uint8、bfloat16:

dtype=self.dtypeout=cast(cast(self,float32)cast(other,float32),dtype)dtype=self.dtype\\ out=cast(\lfloor\frac{cast(self,float32)}{cast(other, float32)}\rfloor,dtype)

RealDiv算子TBE版本的整体流程图如下图所示:

image.png

算子原型

名称 类别 dtype format shape 介绍
input_x 输入 fp32,fp16,int32,int8,uint8,bf16 ND all 输入
input_y 输入 fp32,fp16,int32,int8,uint8,bf16 ND all 输入
output 输出 fp32,fp16,int32,int8,uint8,bf16 ND all 输入

算子支持类型

Atlas A2 训练系列产品/Atlas 800I A2推理产品

host侧设计方案

算子计算过程不涉及数据的维度信息,故在host侧将数据视为一维向量,仅考虑数据个数,不考虑数据维度信息。
任务均分:coreNum 根据输入长度和块大小动态调整,确保每个核心处理的数据块数均匀。
批量搬运:tileBlockNum 和 tileDataNum 计算单次搬运的数据量,通过 finalSmallTileNum 和 finalBigTileNum 确定小核/大核的搬运次数,将多次搬运合并为批量操作,减少冗余开销。尾块的处理逻辑确保不完整块也能被合并到计算流程中,避免数据碎片。

1) 分核策略

优先使用满核的原则。
如果核间能均分,可视作无大小核区分,大核小核数据块一致;
如果核间不能均分,需要将余出的数据块分配到前几个核上。
输入数据大小计算:通过GetInputShape和GetDataTypeLength函数获取输入数据的大小和类型长度,计算出输入数据的总字节数。
UB内存大小和核心数量获取:通过平台信息获取UB内存大小和核心数量,并根据这些信息调整核心数量。

2) 数据分块和内存优化策略

充分使用UB空间的原则。

需要考虑不同硬件的UB大小不同、是否开启double buffer、kernel侧API实现过程中是否需要临时数据的储存,综合考虑单核内切分的大小。

UB内存大小获取:通过GetCoreMemSize函数获取UB内存的大小,用于后续的数据切分计算。

Tile块计算:根据UB内存大小和预定义的BLOCK_SIZE及BUFFER_NUM和不同类型下的ubDataNum,计算出每个Tile块的数据数量。

数据切分:将输入数据按照计算出的Tile块大小进行切分,计算出每个core需要处理的数据块数量和最后一个block的剩余数据量。

设置切分参数:将计算出的切分参数(如每个core的数据量、Tile块大小等)设置到FloorDivTilingData对象中。

这些策略确保了数据在多个核心之间的均匀分布,并且在单个核心内进行了合理的切分,以提高并行处理的效率。

3) tilingkey规划策略

不进行tilingkey划分,在kernel侧利用输入数据的类型来走不同的分支。

kernel侧设计方案

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

  1. 依照TBE实现,将非float32数据精度转换为float32计算后,对于输入类型为float16、int32、bfloat16时,计算后的float32类型数据使用Floor向下取整并使用CAST_FLOOR转换为原数据。对于int8和uint8类型数据先转换为half在转换为float进行计算,计算后的float类型使用Floor向下取整并使用CAST_FLOOR先转换为half类型在转换为原数据类型。
  2. AscendC的FloorDiv算子流程见下图。

图片.png

关联的Issue

暂无

测试

不涉及

文档更新

新增floor_div文档aclnnFloorDiv.md

类型标签

likedislike
当前Pull Request已关闭, 关闭人@sunday
CANN-robot
CANN-robot成员
2025年11月11日 评论:

Thank your for your pull-request.

The full list of commands accepted by me can be found at here.

You can get sig-info at here

likedislike
CANN-robot
CANN-robot成员
2025年11月11日 评论:

以下是根据您提交的修改文件推荐的Reviewer和Committer序列,需各模块评审通过后方可合入

Module List Reviewers Committers
repo-cann/ops-math jia0liang, wei-peng-1991, chenqi317, LiWei79, yu-xinjie62 zhou-qilong, gubaocheng, loov1
likedislike
CANN-robotCANN-robot成员
2025年11月11日 添加了label:cann-cla/no
CANN-robot
CANN-robot成员
2025年11月11日 评论:

🔵 source code change are detected, tasks labels is removed in this pull request!

likedislike
leozxw
leozxw
2025年11月11日 评论:

/check-cla

likedislike
leozxwleozxw
2025年11月11日 推送  1 个提交:6181df9f-Add the readme for the floor_div operator
CANN-robot
CANN-robot成员
2025年11月11日 评论:

以下是根据您提交的修改文件推荐的Reviewer和Committer序列,需各模块评审通过后方可合入

Module List Reviewers Committers
repo-cann/ops-math wangrui_, songkai111, LiuXinxin23, luowen203_gg123, su-yueming zhou-qilong, gubaocheng, loov1
likedislike
CANN-robotCANN-robot成员
2025年11月11日 添加了label:stat/needs-squash
CANN-robot
CANN-robot成员
2025年11月11日 评论:

🔵 source code change are detected, tasks labels is removed in this pull request!

likedislike
leozxw
leozxw
2025年11月11日 评论:

/check-cla

likedislike
leozxw
leozxw
2025年11月11日 评论:

/check-cla

likedislike
leozxwleozxw
2025年11月11日 强制推送  1 个提交:6143aef6-Add the readme for the floor_div operator
CANN-robot
CANN-robot成员
2025年11月11日 评论:

以下是根据您提交的修改文件推荐的Reviewer和Committer序列,需各模块评审通过后方可合入

Module List Reviewers Committers
repo-cann/ops-math su-yueming, rxtfeng, demoauguste, zhajianqing123, jia0liang zhou-qilong, gubaocheng, loov1
likedislike
CANN-robotCANN-robot成员
2025年11月11日 删除了label:stat/needs-squash
CANN-robotCANN-robot成员
2025年11月11日 删除了label:cann-cla/no
CANN-robotCANN-robot成员
2025年11月11日 添加了label:cann-cla/yes
CANN-robot
CANN-robot成员
2025年11月11日 评论:

🔵 source code change are detected, tasks labels is removed in this pull request!

likedislike
zpf1452233
zpf1452233
2025年11月12日 评论:

评审通过

likedislike
leozxwleozxw
2025年11月20日 修改标题为 “【社区任务】CANN训练营第二季社区任务 floor_div”,原标题为“CANN训练营第二季社区任务 floor_div”
此处折叠了6条事件消息 查看更多
CANN-robotCANN-robot成员
3月20日 将gitee-duhuiping,gitcode-chenjiao设为审查人
CANN-robot
CANN-robot成员
3月20日 评论:

CLA Signature Pass

zhou-qilong, thanks for your pull request. All authors of the commits have signed the CLA. 👍

likedislike
sunday成员
3月20日 评论:

您好,我们对超出3个月的设计文档PR,进行统一关闭。

likedislike
Ssunday成员
3月20日 关闭了 pull request