已关闭
[Requirement|需求建议]: 【社区任务】新增 experimental Gcd Ascend C 算子 #2190
~~灏创建于 7月9日关闭于 7月20日
7月9日 添加了label:requirement
7月9日 关联了pull request:feat(gcd): add experimental Ascend C Gcd operator
~~灏
7月9日 评论:
7月9日 评论:
7月10日 将 Morikunn 设为负责人
7月20日 关闭了 issue
7月20日 添加了label:resolved


一、背景信息 (必填)
社区任务第二阶段需要在
cann/ops-math中提交 Gcd 算子源码实现。该实现新增experimental/math/gcd,提供aclnnGcdACLNN 直调入口,对self与other执行逐元素最大公约数计算,输出 shape 为 broadcast 后结果。当前实现覆盖 ND、rank 1-8、broadcast、非连续输入/输出,以及
float32、float16、bfloat16、int8、uint8、int16、int32、int64。浮点有限值按向 0 截断后的整数语义计算 Gcd,并按需要 cast 回输出 dtype;混合 dtype 由 ACLNN wrapper 按 promote/cast 规则转内部 same-dtype 计算。二、价值/作用 (必填)
三、设计方案 (必填)
3.1 使能方式(涉及哪些框架:如Aclnn直调、Pytorch训练等)
通过
experimental/math/gcd下的 ACLNN 直调入口aclnnGcd使能,构建后生成 experimental package。仓库内提供experimental/math/gcd/examples/run_60cases.sh作为本地复验入口。3.2 总体设计
3.2.1 算子支持的数据类型
支持
float32、float16、bfloat16、int8、uint8、int16、int32、int64。混合 dtype 输入由 wrapper 按PromoteType(self, other)转内部 same-dtype Gcd,结果按输出要求 cast。3.2.2 host侧设计
host tiling 位于
experimental/math/gcd/op_host/gcd_tiling.cpp,生成 rank、broadcast 后 shape、两路输入 stride、输出元素数和多核切分信息。stride 为 0 表示该维度 broadcast 复用同一输入元素;blockDim 按输出 storage word 数选择。3.2.3 kernel侧设计
kernel 位于
experimental/math/gcd/op_kernel/gcd.cpp和experimental/math/gcd/op_kernel/gcd.h。kernel 侧使用 GM scalar broadcast 计算,不物化 broadcast 输入;dense contiguous same-shape 场景走线性 GM 地址快路径,存在 broadcast stride 时走通用 offset cursor 路径。小幅值输入使用小质因数分解路径,大幅值保留 Euclid modulo 路径。3.3 支持硬件
Atlas A2/A3;当前配置覆盖
ascend910b与ascend910_93。3.4 算子约束限制
NaN/Inf不属于当前有效输入域。💡 备注(选填)
本地复验入口:
bash experimental/math/gcd/examples/run_60cases.sh。当前提交记录的通过标志为ALL_LOCAL_GCD_CASES_PASSED cases=105;自验证文档记录 60 个 public_v1 case 正确性 60/60 PASSED,TBE-anchorkernel_vs_kernelgeomean 11.2246x、min 1.1284x。