已关闭
[Requirement|需求建议]: ViewCopy算子AscendC实现贡献 #2183
Andy Zhang创建于 7月8日关闭于 7月9日
7月8日 关联了pull request:西工大智能感知交互实验室-AscendC实现ViewCopy算子贡献
Andy Zhang
7月8日 评论:
7月8日 评论:
/assign @hehe7758511


7月8日 将 hehe7758511 设为负责人
7月9日 移除了负责人 hehe7758511
7月9日 将 hehe7758511 设为负责人
7月9日 移除了负责人 hehe7758511
7月9日 关闭了 issue
7月10日 添加了label:resolved
Thanks for sending an requirement! Please fill in the following template to help quickly solve your problem.
ViewCopy AscendC 重构适配
一、背景信息(必填)
使用 AscendC 对 TBE 实现的 ViewCopy 算子进行重构,实现 AscendC 版本 ViewCopy 算子对 Atlas A2 训练系列产品的适配。
二、价值/作用(必填)
ViewCopy 用于支持基于
size / stride / storage_offset描述的 view 拷贝场景,可覆盖连续 Tensor、非连续 Tensor、带 storage offset 的切片、转置、置换以及 dst overlap 等数据搬运需求。本需求通过 AscendC 重构 ViewCopy 算子,提升算子在 Atlas A2 训练系列产品上的可维护性和适配能力,并支持 ACLNN 直调方式使用。相比原 TBE 实现,AscendC 实现便于后续针对不同 shape、stride、overlap 场景进行精细化优化,同时可支撑训练框架中 view copy、非连续 Tensor 写回等常见场景。
三、设计方案(必填)
3.1 使能方式(涉及哪些框架:如 Aclnn 直调、Pytorch 训练等)
当前通过 ACLNN 直调方式使能,提供如下接口:
aclnnViewCopyGetWorkspaceSizeaclnnViewCopy算子输入输出如下:
dstdst_sizedst_stridedst_storage_offsetsrcsrc_sizesrc_stridesrc_storage_offsetdst3.2 总体设计
ViewCopy 的总体语义为:先保留
dst原始 storage 内容,再根据dst_size / dst_stride / dst_storage_offset和src_size / src_stride / src_storage_offset描述的 view 映射,将srcview 中的数据拷贝到dst对应 view 位置,最终输出更新后的dst。3.2.1 算子支持的数据类型
数据 Tensor 支持:
float16,float32,bfloat16int8,int16,int32,int64uint8,uint16,uint32bool元数据 Tensor 支持:
size / stride / storage_offsetint32,int643.2.2 host 侧设计
Host 侧主要完成参数检查、metadata 读取和 tiling 计算。
dst / src / output数据类型一致dst_size / dst_stride / dst_storage_offset / src_size / src_stride / src_storage_offset类型一致,且为int32或int64[1, 8]viewNum、dstSpan、dstOverlapblockDimHost 侧设计流程图:
flowchart TD A["进入 ViewCopy tiling"] --> B["获取输入/输出描述信息"] B --> C{"dtype 是否合法且一致"} C -- 否 --> C1["返回参数错误"] C -- 是 --> D{"metadata dtype 是否为 int32/int64 且一致"} D -- 否 --> D1["返回参数错误"] D -- 是 --> E["校验 rank 与 metadata shape"] E --> F{"metadata 是否可 host 侧读取"} F -- 否 --> G["metadataReady = 0<br/>运行时由 kernel 读取 metadata"] F -- 是 --> H["读取 size/stride/storage_offset"] H --> I["计算 viewNum / dstSpan"] I --> J["判断 dst 是否可能 overlap"] G --> K["按保守策略设置 tiling"] J --> L{"是否 dst overlap"} L -- 是 --> M["按 dst 物理地址 block 切分"] L -- 否 --> N{"是否命中特殊连续/转置模式"} N -- 是 --> O["选择连续片段或特殊模式切分"] N -- 否 --> P["按 view 线性元素切分"] K --> Q["设置 blockDim / tilingKey / tilingData"] M --> Q O --> Q P --> Q Q --> R["返回 tiling 成功"]3.2.3 kernel 侧设计
Kernel 侧基于 AscendC 实现数据搬运逻辑。
dst overlap 反推优化:
Kernel 侧设计流程图:
flowchart TD A["进入 ViewCopy kernel"] --> B["根据 tilingKey 选择模板实例<br/>1B/2B/4B/8B"] B --> C{"metadataReady 是否为 1"} C -- 否 --> D["从 GM 读取 size/stride/storage_offset"] C -- 是 --> E["使用 tiling 中 metadata"] D --> F["计算 viewNum / dstSpan / dstOverlap"] E --> F F --> G{"viewNum 是否为 0"} G -- 是 --> G1["直接返回"] G -- 否 --> H{"dst 是否 overlap"} H -- 是 --> I["按 dst 物理地址范围处理"] I --> J["构造 TensorIterator 写入顺序"] J --> K["构造 suffix max / suffix gcd"] K --> L["遍历当前 core 负责的 dst 地址"] L --> M{"dst 地址是否可由 stride 表示"} M -- 否 --> L M -- 是 --> N["反推最后一次写入该 dst 的 src offset"] N --> O["写入 output dst"] O --> L H -- 否 --> P{"是否为特殊 3D transpose 模式"} P -- 是 --> P1["执行 transpose 专用搬运"] P -- 否 --> Q{"是否为连续 slice 模式"} Q -- 是 --> Q1["按 slice/chunk 连续搬运"] Q -- 否 --> R["按线性 view index 计算 offset 搬运"] P1 --> S["必要时清理 cache"] Q1 --> S R --> S L --> S S --> T["kernel 结束"]Overlap 场景伪代码如下:
3.3 支持硬件
支持3.4 算子约束限制
[1, 8]dst / src / output数据类型必须一致int32或int64dst_size与src_size需要一致备注(选填)
已使用覆盖多 dtype、多 rank、多 shape、连续/非连续、稀疏 stride、storage offset、dst/src storage size 不等以及 dst overlap 的测试用例进行验证,并通过自定义 AscendC 算子性能测试。