拓冰建站拓冰建站
首页 / 资讯中心 / 正文

PyPTO 最大公约数算子实战:pypto.Tensor.gcd 接口说明、TileShape 配置与逐元素 Euclid 算法实现剖析

PyPTO 最大公约数算子实战pypto.Tensor.gcd 接口说明、TileShape 配置与逐元素 Euclid 算法实现剖析【免费下载链接】pyptoPyPTO发音: pai p-t-oParallel Tensor/Tile Operation编程范式。项目地址: https://gitcode.com/cann/pyptoPyPTO 作为 Parallel Tensor/Tile Operation 编程范式提供了接近 NumPy/PyTorch 的逐元素数学算子体验。pypto.Tensor.gcd以及其模块级对应函数pypto.gcd用于对两个 Tensor 的对应元素求最大公约数支持张量与标量混合计算、多维度广播以及整数类型的定点计算。本文将结合 gcd 接口文档 与 pypto.gcd 操作文档完整覆盖其支持的产品形态、参数约束、TileShape 切分配置、调用示例并深入python/pypto与framework/src源码剖析该算子在 Python 层封装、C 层校验与 TileOp 逐元素实现基于固定迭代次数 Euclid 算法背后的原理帮助你在 Ascend 平台上正确、高效地使用该算子。功能语义什么是最大公约数计算gcdGreatest Common Divisor对input与other的对应元素求最大公约数即对每个位置i计算output[i] gcd(input[i], other[i])结果为非负整数语义与torch.gcd对齐负数输入的公约数取绝对值如gcd(-8, 12) 4元素gcd(x, 0)的结果为|x|本身该算子为逐元素elementwise二元运算返回的新 Tensor 不修改输入。产品支持情况gcd算子当前支持以下产品形态见 pypto-Tensor-gcd.md 与 pypto-gcd.md产品系列支持情况Ascend 950PR / Ascend 950DT支持Atlas A3 训练系列产品 / Atlas A3 推理系列产品支持Atlas A2 训练系列产品 / Atlas A2 推理系列产品支持接口原型与两种调用方式官方函数原型gcd(input, other: Tensor | int) - Tensor即other既可以是 Tensor也可以是 Python 整数int对应两种调用形态Tensor 成员方法tensor.gcd(other)定义于 python/pypto/tensor.pysource_location def gcd(self: Tensor, other: Tensor | int) - Tensor: return pypto.gcd(self, other)模块级函数pypto.gcd(input, other)定义于 python/pypto/op/math.py并从pypto包顶层导出见 python/pypto/init.py 中的from .op import *。两者最终走同一条底层调用链方法形式只是把self转发给模块级函数。参数与约束说明参数表参数名输入/输出说明input输入源操作数。支持的类型为Tensor。Tensor 支持的数据类型为DT_INT8、DT_INT16、DT_INT32、DT_UINT8。不支持空 TensorShape 仅支持 1-4 维支持多维度广播到相同形状Shape Size 不大于 2147483647即 INT32_MAX。other输入源操作数。支持的类型为 int 以及 Tensor 类型。Tensor 支持的数据类型为DT_INT8、DT_INT16、DT_INT32、DT_UINT8。不支持空 TensorShape 仅支持 1-4 维支持多维度广播到相同形状Shape Size 不大于 2147483647即 INT32_MAX。约束说明input与other的数据类型必须相同Tensor 与 Tensor 计算时Tensor 类型输入不支持TileOpFormat.TILEOP_NZ格式即需使用非 NZ 的标准格式存储。这些约束并非仅停留在文档层面C 层在算子派发时做了严格校验见 framework/src/interface/operation/vector/binary.cppTensor Gcd(const Tensor self, const Tensor other) { DECLARE_TRACER(); CheckTensorFormat(self.GetStorage(), {TileOpFormat::TILEOP_NZ}, Gcd); CheckTensorFormat(other.GetStorage(), {TileOpFormat::TILEOP_NZ}, Gcd); CheckTensorsDataTypeConsistency(self.GetStorage(), other.GetStorage(), GCD); CheckTensorDimRange(self.GetStorage(), 1, NUM_VALUE_4, GCD); std::unordered_setDataType supportedTypes {DT_INT8, DT_INT16, DT_INT32, DT_UINT8}; CheckTensorDataType(self.GetStorage(), supportedTypes, GCD); return TensorBinaryOperationBinaryOpType::GCD(*Program::GetInstance().GetCurrentFunction(), self, other); }可以确认文档中的每条约束都在算子入口被Check*系列函数强制执行包括格式检查拒绝 TILEOP_NZ、数据类型一致性、维度范围1-4 维与支持类型白名单仅四种整数类型。若other为 Python 标量则走 framework/src/interface/operation/vector/binary_scalar.cpp 中的Gcd(const Tensor self, const Element other)标量重载同样执行格式与类型校验。返回值说明返回输出 Tensor数据类型与input、other相同四种支持类型之一Shape为input与other广播后的形状广播遵循与 NumPy/PyTorch 一致的规则即从尾维开始对齐维度为 1 的轴自动扩展。实际用法TileShape 配置与调用示例第一步通过 set_vec_tile_shapes 设置 TileShape在调用该 operation 接口前应通过pypto.set_vec_tile_shapes设置 Vector 计算的 TileShapeTileShape 尾轴须 32Byte 对齐与 Vector 单元访存对齐要求相关TileShape 维度应与输出 Tensor 维度一致TileShape 各维数值分别用于切分输出张量的对应轴。set_vec_tile_shapes定义于 python/pypto/_controller.py接受可变数量的整数参数例如pypto.set_vec_tile_shapes(1, 1, 8, 8)会设置四维切分形状[1, 1, 8, 8]。示例 1非广播场景。输入inputshape 为[m, n]othershape 为[m, n]输出为[m, n]。设置TileShape [m1, n1]则m1、n1分别用于切分m、n轴pypto.set_vec_tile_shapes(4, 16)示例 2广播场景。输入inputshape 为[m, n]othershape 为[m, 1]输出仍为[m, n]。同样设置TileShape [m1, n1]m1、n1分别用于切分m、n轴pypto.set_vec_tile_shapes(4, 16)第二步接口调用示例以下示例同时演示了Tensor 与 Tensor、Tensor 与标量int两种调用形态x pypto.tensor([2, 3], pypto.DT_INT32) y pypto.tensor([2, 3], pypto.DT_INT32) z pypto.gcd(x, y) # Using a scalar c pypto.gcd(x, 2)结果示例如下输入数据x: : [[9 9 9], [6 6 6]] 输入数据y: [[1 2 3], [1 2 3]] 输出数据z: [[1 1 3], [1 2 3]] 输出数据c: [[1 1 1], [2 2 2]]结果验证gcd(9,1)1、gcd(9,2)1、gcd(9,3)3、gcd(6,1)1、gcd(6,2)2、gcd(6,3)3标量模式下gcd(9,2)1、gcd(6,2)2与数学定义完全一致。标量模式other 为 int的实现路径当other为 Python 整数时Python 层会将其包装为与input同数据类型的 Element 再下发见 python/pypto/op/math.pyif isinstance(other, pypto_impl.Tensor): return pypto_impl.Gcd(input, other) else: return pypto_impl.Gcd(input, pypto_impl.Element(input.dtype, other))底层对应的 TileOp 为TGcdS实现在 framework/src/interface/tileop/vector/binary_scalar/extended.h#define OP_TILE_OP_GCDS TGcdS把标量广播到整条 Tile 上参与逐元素运算。源码级原理逐元素 Euclid 算法如何映射到 Vector Tilegcd的 Device 侧逐元素实现在 framework/src/interface/tileop/vector/binary/gcd.h模板函数TGcd通过一组 Vector 指令TMOV/TCVT/TMINS/TMAXS/TMUL/TSUB/TDIV/TCMPS/TSEL等完成整个计算从源码结构可以归纳出以下关键设计1. 按输入位宽选择计算类型防溢出using CalcType typename std::conditionalStd::is_same_vtypename T0::Type, int8_t || Std::is_same_vtypename T0::Type, uint8_t, int16_t, int32_t::type;int8/uint8输入时中间计算使用int16槽中间值 ≤ 510int16/int32输入时使用int32槽q*b最大可达ab ≤ 65534/2e8确保 Euclid 迭代过程中除法商与余数不溢出。2. 类型转换的中转策略a2/a3架构的TCVT没有int8/uint8/int16 → int32的直接转换因此统一先转到计算位宽int32直接TMOVint16经f32中转CAST_NONECAST_RINTint8/uint8经f16中转小整数转换无精度损失。输出阶段同理int8/uint8需经s16 → f32 → f16 → s8/u8两级转换。3. 绝对值与最小值符号回绕处理代码通过|x| x * clamp(x, -1, 1)计算绝对值对int16的-32768与int8的-128这类最小值取绝对值会回绕的边界情况用TCMPS比较后通过TADDS/TSEL修正与torch.gcd语义保持一致。4. 固定迭代次数的 Euclid 迭代为避免仿真器上whileGetValue标量同步竞态卡死算法采用固定迭代次数的 Euclid 迭代迭代上限按输入位宽分级输入类型最大 Euclid 步数理论固定迭代上限int32≤ 1e8≤ 40Fibonacci 界64int16≤ 32767≤ 2332int8/uint8≤ 255≤ 1316每轮迭代中用TCMPS(bTile, 0, EQ)生成掩码冻结b 0的 lane避免除零收敛后保持(gcd, 0)不变对符号做归一化bNeg掩码以 floored 除法求精确余数并做 ±1 修正使用f32槽做高精度除法TDIVDivAlgorithm::HIGH_PRECISION得到商再回算余数将 C 截断余数转换为非负 gcd 语义最终dst |a|输出非负结果。5. 广播与多维切分外层三层for循环n0/n1/n2Index遍历 1-4 维张量的 Tile 网格对每个输入通过Src0TileInfo/Src1TileInfo的 tile 信息与GetBrcOperandAt判定该维是否广播维度为 1 时偏移恒为 0实现other为[m, 1]这类逐维广播的取数逻辑与文档中支持多维度广播到相同形状的说明一一对应。测试验证以 torch.gcd 为黄金基准仓库在 python/tests/st/operation/vector/test_gcd_onboard.py 与 python/tests/st/operation/vector/test_gcds_onboard.py 中提供了完整系统测试两输入 Tensor 场景gcd_onboard_2d_2input_kernel在pypto.frontend.jit编译的 kernel 内先pypto.set_vec_tile_shapes(*config.tile_shape)再通过双层pypto.loop循环 张量切片取 view调用pypto.gcd(input0_view, input1_view)最后pypto.assemble写回输出标量场景gcds_onboard_2d_1input_kernel直接调用pypto.gcd(input0_view, config.scalar)测试用例集GCD_ONBOARD_TESTS覆盖了广播输入某维为 1、多种 tile_shape 与 loop 切分组合并以torch.gcd的结果作为 golden 基准逐元素比对expected [torch.gcd(*inputs_cpu)] ... assert_outputs(outputs, expected)这从测试维度印证了文档声明的结果与torch.gcd语义一致这一实现事实。使用注意事项小结数据类型必须匹配Tensor 与 Tensor 计算时两者类型必须一致且只能是DT_INT8/DT_INT16/DT_INT32/DT_UINT8四种之一标量other会被自动包装成与input相同的类型维度与形状仅支持 1-4 维、不支持空 Tensor总元素数不超过INT32_MAX广播时输出形状取两者广播后的并集存储格式输入不支持TILEOP_NZ格式请使用标准 Row-Major 类布局TileShape 必须与输出维度一致且尾轴 32Byte 对齐否则切分可能出错或性能劣化边界语义最小值取绝对值如int16的-32768、int8的-128时结果与torch.gcd保持一致输出恒为非负值结果验证如果希望对照验证计算结果可直接以torch.gcd作为参考实现仓库测试亦采用该黄金比对方式。综上pypto.Tensor.gcd/pypto.gcd是一个面向整数类型的逐元素求最大公约数算子其用法简洁支持 Tensor 与 int 混合输入、约束清晰四种整数类型、1-4 维、非 NZ 格式、TileShape 32Byte 对齐且从 Python 封装到 C 校验再到 Device 侧固定迭代 Euclid 算法整条调用链都有仓库源码可以追溯适合作为了解 PyPTO Vector 二元算子的典型范例。【免费下载链接】pyptoPyPTO发音: pai p-t-oParallel Tensor/Tile Operation编程范式。项目地址: https://gitcode.com/cann/pypto创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门