Gcd 算子开发设计文档【免费下载链接】cann-ops-competitions本仓库用于 CANN 开源社区各类竞赛、开源课题、社区任务等课题发布、开发者作品提交和展示。项目地址: https://gitcode.com/cann/cann-ops-competitions一、需求背景1.1 需求来源为完成社区任务 2026 年 5 月Gcd算子开发任务需要在 Atlas A2 训练系列产品 / Atlas A3 系列产品上基于 Ascend C 实现与内置aclnnGcd功能一致并满足任务书扩展要求的算子最终贡献到昇腾算子开源仓cann/ops-math。1.2 背景介绍1.2.1 Gcd 算子实现优化Gcd算子用于对self与other两个输入张量逐元素计算最大公约数两个输入需要满足 broadcast 关系输出 shape 为 broadcast 后的 shape。本任务要求在原有整数 GCD 能力基础上覆盖任务书指定的数据类型、维度、广播和非连续 Tensor 场景。本次设计覆盖范围支持fp32、fp16、bf16、int8、uint8、int16。支持 ND 格式rank 范围为 1-8。支持输入 Tensor 非连续。支持self、other按标准 broadcast 规则推导输出 shape。适配硬件按任务书覆盖 Atlas A2 训练系列产品 / Atlas A3 系列产品int8、uint8同样纳入 A2/A3 验证矩阵。本次设计采用“基线 交付”双方案描述现有 TBE 基线内置gcd.py的动态算子注册与tbe.vgcd路径用于说明当前参考实现的真实入口和能力边界本次 Ascend C 交付按当前实现落地的 ACLNN 两段式 Ascend C kernel 方案用于覆盖任务书扩展 dtype、broadcast 和非连续场景。1.2.2 现有 TBE 基线实现现有内置Gcd参考实现位于动态 TBE 算子gcd.py其真实流程为register_operator/register_operator_compute完成算子注册通过 dtype 校验限定int16、int32、int64使用classify(..., OpPatternMode.ELEWISE_WITH_BROADCAST)处理 broadcast 分组使用shape_util.variable_shape和tvm.placeholder构造动态输入在 compute 阶段执行shape_util.broadcast_shapes、tbe.broadcast和tbe.vgcd通过tbe.auto_schedule和tbe.build生成最终算子。该路径仅作为基线与能力边界参考不代表本次任务的最终交付实现。对于浮点类型基线实现并不覆盖任务书要求的fp32、fp16、bf16合同。1.2.3 现有 TBE 基线流程图1.2.4 本次 Ascend C 交付概览本次交付方案不复用上述 TBE 计算图而是按当前实现采用 ACLNN 两段式接口 Ascend C kernel。Host 侧负责参数校验、broadcast 关系与连续化准备、tiling 数据生成和分核Kernel 侧通过输出线性坐标与OffsetCursor完成 broadcast 偏移映射并按当前实现的 float 截断语义和整数 GCD 语义完成计算。详细设计见 3.2 节。二、需求分析2.1 外部组件依赖算子需要接入 ACLNN 两段式接口与ops-math算子工程依赖组件包括ACLNN 参数校验、executor、workspace 管理和 stream 执行框架GE/OpDef 注册体系用于声明输入输出 dtype、format、shape 能力Ascend C Kernel 运行时用于 GM/UB 搬运、矢量计算、分核执行Broadcast 调度组件或等价的 Host/Kernel 侧索引映射逻辑用于处理非同形输入。2.2 内部适配模块内部需要完成以下模块op_api实现aclnnGcdGetWorkspaceSize与aclnnGcd接口完成空指针、dtype、shape、broadcast 和 out shape 校验。op_host实现算子原型注册、shape 推导、tiling 数据结构、分核策略和 TilingKey 编码。op_kernel实现 Ascend C 计算内核根据 dtype 和是否广播进入不同计算路径。tests提供 UT/ST、ACLNN 调用样例和自验证脚本覆盖 dtype、broadcast、非连续、边界值和 A2/A3 硬件矩阵。2.3 算子原型定义参数名输入/输出描述使用说明数据类型数据格式维度(shape)非连续 Tensorself输入第一个输入张量shape 需与 other 满足 broadcast 关系fp32, fp16, bf16, int8, uint8, int16ND1-8是other输入第二个输入张量shape 需与 self 满足 broadcast 关系fp32, fp16, bf16, int8, uint8, int16ND1-8是out输出最大公约数结果shape 为 self 与 other broadcast 后 shape与输入推导 dtype 一致ND1-8是2.4 主要约束self、other与out的 dtype 需要满足任务书和 ACLNN 数据类型推导规则。输入 rank 必须在 1-8 范围内。self与other必须满足标准 broadcast 关系。out的 shape 必须等于 broadcast 后 shape。整型语义为gcd(abs(self), abs(other))其中gcd(0, 0) 0。浮点类型按任务扩展语义处理输入为有限浮点值先按向 0 截断转换到整数语义再计算 GCD 并 cast 回原 dtype非有限浮点不作为合法精度用例。三、详细设计3.1 使能方式算子通过 ACLNN 两段式接口使能aclnnStatus aclnnGcdGetWorkspaceSize( const aclTensor* self, const aclTensor* other, aclTensor* out, uint64_t* workspaceSize, aclOpExecutor** executor); aclnnStatus aclnnGcd( void* workspace, uint64_t workspaceSize, aclOpExecutor* executor, aclrtStream stream);3.2 总体设计3.2.1 Host 侧设计入参校验Host 侧在 tiling 前完成以下校验空指针校验self、other、out、workspaceSize、executor不能为空dtype 校验仅允许任务书指定 dtype并校验输入输出 dtype 推导关系rank 校验输入输出 rank 均在 1-8 范围内broadcast 校验逐维检查self与other能否 broadcastout shape 校验推导得到的 broadcast shape 必须与outshape 一致非连续 Tensor使用 view shape / stride 信息完成逻辑 shape 校验Kernel 侧按逻辑索引或框架准备后的连续视图处理。分核策略Host 根据 broadcast 后总元素数totalNum、dtype 字节数、UB 大小和可用 AI Core 数量生成切分参数无广播或 broadcast 后可线性连续访问的场景按totalNum满核均分尾块由末尾或前若干核心承接一般 broadcast 场景保留多核切分Kernel 侧根据输出线性 index 反推self与other的逻辑偏移小 shape 场景减少核数或合并 tile避免启动与同步开销超过计算收益大 shape 场景按 UB 容量选择 tile 长度确保输入、中间 buffer、输出 buffer 不超过 UB。TilingKey 规划TilingKey 用于 Kernel 侧快速选择 dtype 与 broadcast 分支字段说明低 3 bitdtype 编码int8、uint8、int16、fp16、bf16、fp32bit 3是否存在 broadcastbit 4是否存在非连续访问高位预留硬件或算法扩展Tiling 数据中同时保存输出总元素数、各输入 shape、stride、broadcast 后 shape、每核起止 offset、tile 长度等信息。3.2.2 Kernel 侧设计Kernel 采用Init - Process - CopyIn - Compute - CopyOut的流水线结构。每个核心处理一段输出线性空间必要时根据 broadcast 规则计算输入 offset。数据类型处理策略输入 dtype中间计算 dtype处理方式int8int32符号扩展到 int32取绝对值后计算 GCD再 cast 回 int8uint8int32零扩展到 int32计算 GCD 后 cast 回 uint8int16int32扩展到 int32计算 GCD 后 cast 回 int16fp16int32/int64cast 到 float32 后校验/截断到整数语义计算 GCD 后 cast 回 fp16bf16int32/int64cast 到 float32 后按整数语义计算结果 cast 回 bf16fp32int32/int64按整数语义计算 GCD结果 cast 回 fp32GCD 计算核心整型核心逻辑采用欧几里得算法或二进制 GCD 算法对输入取绝对值若a 0结果为b若b 0结果为a循环计算gcd(a, b) gcd(b, a % b)直到b 0将中间结果转换回输出 dtype。对于向量化路径可使用 mask 和 select 表达分支减少标量跳转对于复杂 broadcast 或尾块使用标量索引映射保证 correctness。广播索引映射对于输出线性索引out_idx按 broadcast 后 shape 反解多维坐标若某输入对应维度为 1则该维输入坐标取 0否则使用输出坐标根据输入 stride 计算 GM 偏移读取self与other对应元素参与计算。3.2.3 Ascend C 实现流程图3.3 支持硬件支持 Atlas A2 训练系列产品 / Atlas A3 系列产品。int8、uint8、int16、fp16、bf16、fp32均按任务书进入支持与测试范围不因某一历史文档或现有实现的窄化描述从 A3 验证矩阵中移除。3.4 算子约束限制不支持 rank 0 或 rank 大于 8 的输入。不支持无法 broadcast 的输入 shape。不支持输出 shape 与 broadcast 推导结果不一致的调用。浮点输入按有限浮点值、向 0 截断后的整数语义验证非有限浮点不作为合法精度验收场景。不使用 CPU fallback、Python fallback、PyTorch 高层等价算子或 vendor 整算子作为被测路径。四、特性交叉分析类型泛化覆盖任务书指定的 6 类 dtype并通过 TilingKey 区分不同计算路径。形状泛化覆盖 rank 1-8、同形、单边 broadcast、多维 broadcast 和尾块。非连续 Tensor通过逻辑 shape/stride 或框架准备后的连续视图处理保证结果按逻辑 Tensor 语义计算。硬件兼容A2/A3 均纳入验证矩阵按硬件 UB、核数和 dtype 字节数生成 tiling。实现边界最终被测路径为 Ascend C 自有实现不依赖参考实现或框架高层算子完成核心计算。五、可维可测分析5.1 精度标准精度按任务书要求满足 AscendOpTest 默认阈值整型与手写参考实现逐元素完全一致浮点与任务定义的有限浮点、向 0 截断后的整数参考实现一致并满足对应 dtype 默认阈值覆盖0、负数、gcd(0, 0)、broadcast、非连续 Tensor、rank 边界和 dtype 边界。参考实现需要手写不能直接使用torch.gcd覆盖浮点场景。推荐参考逻辑为将self与otherbroadcast 到输出 shape对浮点输入先校验isfinite且为整数值转换到int64后计算gcd(abs(a), abs(b))将结果转换回输出 dtype。5.2 性能标准性能按任务书要求所有核参与计算场景下性能不低于原 TBE 算子小 shape 若无法达标需提供性能仿真图和分析结论说明 Ascend C 实现与 TBE 实现一致或优于 TBE性能测试覆盖连续、broadcast、不同 dtype、不同 rank、不同数据规模和 A2/A3 硬件。5.3 兼容性分析本设计对齐 ACLNN 两段式接口、ND 格式、broadcast 规则和 ops-math 工程组织方式。对于既有整数 GCD 场景保持兼容对于任务书新增 dtype通过显式 dtype 分支和测试矩阵保证扩展能力可维护、可验证。【免费下载链接】cann-ops-competitions本仓库用于 CANN 开源社区各类竞赛、开源课题、社区任务等课题发布、开发者作品提交和展示。项目地址: https://gitcode.com/cann/cann-ops-competitions创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考