PyPTO pypto.exp2 逐元素 2 的幂运算:从接口参数、TileShape 切分到源码实现的完整指南

发布时间:2026/11/12 16:09:09

PyPTO pypto.exp2 逐元素 2 的幂运算:从接口参数、TileShape 切分到源码实现的完整指南 PyPTO pypto.exp2 逐元素 2 的幂运算从接口参数、TileShape 切分到源码实现的完整指南【免费下载链接】pyptoPyPTO发音: pai p-t-oParallel Tensor/Tile Operation编程范式。项目地址: https://gitcode.com/cann/pypto本篇围绕 PyPTOParallel Tensor/Tile OperationTensor API 中的pypto.exp2接口展开系统讲解该逐元素 2 的幂运算函数的产品支持范围、参数约束、返回值类型规则、临时空间计算方式与 TileShape 切分配置并结合当前仓库的 Python 前端实现、C 框架层实现与系统测试用例说明从接口调用到底层向量切分执行的完整链路。读完本文你可以直接在 NPU 上编写可运行的 exp2 kernel并理解整数输入为何会升精度为 FP32、临时空间公式从何而来。功能说明与产品支持pypto.exp2计算输入 Tensor 中每个元素的 2 的指数即out 2^input属于逐元素element-wise一元运算返回与输入形状相同的 Tensor。当前仓库中该接口的产品支持情况如下Ascend 950PR / Ascend 950DT支持Atlas A3 训练系列产品 / Atlas A3 推理系列产品支持Atlas A2 训练系列产品 / Atlas A2 推理系列产品支持接口定义与完整文档见 pypto-exp2 API 文档。函数原型exp2(input: Tensor) - Tensorexp2在 Python 前端定义于 python/pypto/op/math.py通过op_wrapper装饰器包装并对外暴露。同时Tensor 方法形式Tensor.exp2()也在 python/pypto/tensor.py 中提供内部直接委托给pypto.exp2(self)两种写法等价y pypto.exp2(x) # 函数形式 y x.exp2() # 方法形式参数说明参数名输入/输出说明input输入源操作数。支持的类型为 Tensor。支持的数据类型为DT_FP32、DT_FP16、DT_BF16、DT_INT32、DT_INT16、DT_INT8、DT_UINT8。不支持空 TensorShape 仅支持 1~4 维Shape Size 不大于 2147483647即 INT32_MAX。从源码结构看这些约束在 C 框架层 framework/src/interface/operation/vector/exponential.cpp 的Exp2入口函数中被逐一校验CheckTensorDimRange(..., 1, 4, EXP2)校验维度范围为 1~4 维CheckTensorShapeSize(...)校验 Shape Size 上限框架层声明的直接支持类型集合为{DT_FP32, DT_FP16, DT_BF16, DT_INT32, DT_INT16}。返回值说明返回输出 Tensor其数据类型按输入类型区分当输入是 DT_FP32、DT_FP16、DT_BF16 时输出 Tensor 的数据类型与 input 相同Shape 与 input 相同当输入是 DT_INT32、DT_INT16、DT_INT8、DT_UINT8 时输出 Tensor 的数据类型为 DT_FP32Shape 与 input 相同。整数输入升精度的原因与 C 实现一致在 framework/src/interface/operation/vector/exponential.cpp 的TensorExp2中当输入为 DT_INT32 或 DT_INT16 时结果 LogicalTensor 会显式构造为 DT_FP32。而 DT_INT8 / DT_UINT8 输入则由 Python 前端先行两次 castINT8/UINT8 → FP16 → FP32后走浮点路径见后文“源码实现”一节。约束说明值域范围input 中的值需要在 [-2^24, 2^24] 范围内以确保在计算过程中能精确转换为 float32。这是因为 2 的幂运算的底数与中间量需要以 float32 表示超出该范围的整数无法在 float32 中无损表达。格式限制Tensor 类型输入不支持TileOpFormat.TILEOP_NZ格式。该限制对应源码中 framework/src/interface/operation/vector/exponential.cpp 的CheckTensorFormat(self.GetStorage(), {TileOpFormat::TILEOP_NZ}, Exp2)调用即 NZ 格式输入会被拒绝。临时空间Workspace大小若 TileShape 为[a,b,c,d]需要的临时空间大小按产品区分Ascend 950PR / Ascend 950DTa*b*c*d*sizeof(DT_FP32)Atlas A3 训练系列 / Atlas A3 推理系列a*b*c*(2*d 3*d/8)*sizeof(DT_FP32)Atlas A2 训练系列 / Atlas A2 推理系列a*b*c*(2*d 3*d/8)*sizeof(DT_FP32)临时空间公式与框架实现可以相互印证。在 framework/src/interface/operation/vector/exponential.cpp 的TiledExp2中对于非 FP32 输入会额外申请tmpTensor与tmpTensorNext两个 DT_FP32 临时张量其中tmpShape对最后两维1D 输入退化为 1 维做BLOCK_SIZE / BytesOf(DT_FP32)对齐tmpShape2对最后 1~2 维做 FP32 对齐。从源码结构看2*d 3*d/8这一项即来源于这类“输入拷贝缓冲 对齐后的 FP32 中间缓冲”的合计开销且所有临时缓冲均为 FP32因此公式中统一使用sizeof(DT_FP32)。TileShape 设置示例调用exp2接口前应通过pypto.set_vec_tile_shapes设置 TileShape且 TileShape 的维度应与输出一致。示例 1输入 input shape 为[m, n]输出为[m, n]TileShape 设置为[m1, n1]则m1、n1分别用于切分m、n轴pypto.set_vec_tile_shapes(4, 16)从源码实现看TileShape 的切分逻辑正体现在TiledExp2的递归循环中framework/src/interface/operation/vector/exponential.cpp沿当前维度以vecTile[cur]为步长遍历每步生成一个View片段并递归进入下一维直到所有维度遍历完毕后才在叶子节点真正插入OP_EXP2算子。这也解释了为何 TileShape 维度必须与输出维度一致——切分器是按维度逐级展开的。接口调用示例最简调用如下x pypto.tensor([3], pypto.DT_FP32) y pypto.exp2(x)结果示例输入数据x: [0.0 1.0 2.0] 输出数据y: [1.0 2.0 4.0]下面给出一个完整的逐元素 kernel 写法取自仓库系统测试 python/tests/st/operation/vector/test_exp2.py展示set_vec_tile_shapesloopviewexp2assemble的组合模式import pypto pypto.frontend.jit(debug_options{runtime_debug_mode: 0, compile_debug_mode: 0}) def exp2_2d_1input_kernel(input0: pypto.Tensor(), output: pypto.Tensor(), config: Exp2Config): pypto.set_vec_tile_shapes(*config.tile_shape) for index_0 in pypto.loop(config.loop_ranges[0]): for index_1 in pypto.loop(config.loop_ranges[1]): offsets [index_0 * config.execution_view_shape[0], index_1 * config.execution_view_shape[1]] input0_offset [0 if config.input_shapes[0][axis] 1 else offsets[axis] for axis in range(2)] input0_view pypto.view(input0, config.input_view_shapes[0], input0_offset) result pypto.exp2(input0_view) output_offset [0 if config.output_offset_map[axis] 0 else offsets[config.output_offset_map[axis]] for axis in range(len(config.execution_view_shape))] pypto.assemble(result, output_offset, output)该 kernel 以 TileShape 为单位循环遍历输出张量每次循环用pypto.view取出一个 tile 片段对其调用pypto.exp2再用pypto.assemble把结果片段拼回输出张量是逐元素算子在 PyPTO 中最典型的调用范式。源码实现整数输入为何升精度、exp2 如何落地Python 前端的exp2实现位于 python/pypto/op/math.py核心逻辑可以拆成三步valid_shape input.GetValidShape() if input.dtype in (pypto.DT_INT8, pypto.DT_UINT8): input pypto.cast(input, pypto.DT_FP16) input pypto.cast(input, pypto.DT_FP32) elif input.dtype in (pypto.DT_INT16, pypto.DT_INT32): input pypto.cast(input, pypto.DT_FP32) two_element pypto_impl.Element(input.dtype, 2) x pypto_impl.Full(two_element, input.dtype, input.shape, valid_shape) return pow(x, input)对 DT_INT8 / DT_UINT8 输入前端先 cast 到 DT_FP16再 cast 到 DT_FP32保证整数先被无损地提升到浮点表示最终输出为 FP32与 API 文档“整数输入输出为 DT_FP32”的约定一致对 DT_INT16 / DT_INT32 输入直接 cast 到 DT_FP32该范围内整数值可被 float32 精确表示呼应“值域 [-2^24, 2^24]”的约束浮点输入则保持原 dtypeexp2最终以pow(2, input)底数 2 的 Full 张量与输入做幂运算的方式组合实现。从源码结构看这是把“2 的幂”归约到通用pow算子路径的写法。框架层C则在 framework/src/interface/operation/vector/exponential.cpp 中完成真正的图构建Exp2入口做格式、数据类型、维度、Shape Size 校验TensorExp2创建输出 LogicalTensorINT32/INT16 时输出 DT_FP32并登记Opcode::OP_EXP2操作算子名 TExp2见 framework/src/interface/operation/opcode.cppTiledExp2按 TileShape 递归切分输入在非 FP32 输入时构造按BLOCK_SIZE对齐的 FP32 临时张量最终调用function.AddOperation(Opcode::OP_EXP2, {tile}, {resultTile, tmpTensor, tmpTensorNext})生成设备端指令。此外该算子也接入了解释器路径REGISTER_CALC_OP(OP_EXP2, ...)位于 framework/src/interface/interpreter/calc_vector.cpp可用于本地数值核算。系统测试验证仓库为exp2提供了多层级测试可直接作为行为参考Python 端系统测试python/tests/st/operation/vector/test_exp2.py通过pytest.mark.parametrize驱动多个用例期望值用torch.exp2生成后对比用例配置如 (96, 8192) int16 输入 / fp32 输出、(512, 256, 256) fp32 输入等见 python/tests/st/operation/vector/vector_testcase/exp2_test_case.py其中view_shape与tile_shape的组合覆盖了 TileShape 与张量形状不对齐的场景C 端算子级 STframework/tests/st/operation/src/test_exp2_operation.cpp覆盖 2/3/4 维切分执行代码生成单测framework/tests/ut/codegen/src/test_dynamic/test_codegen_dyn_vector/test_codegen_dyn_exp2.cpp。相关接口Tensor.exp2()方法形式的同一接口见 python/pypto/tensor.pypypto.exp/pypto.expm1同族指数类逐元素算子支持 PrecisionType 参数定义于 python/pypto/op/math.pypl.simt.exp2SIMT标量路径下的 2 的幂运算用于 Pro 端 SIMT 编程见 python/pypto_pro/ir/op/simt_ops.py 与 python/pypto_pro/language/_simt_api.py。【免费下载链接】pyptoPyPTO发音: pai p-t-oParallel Tensor/Tile Operation编程范式。项目地址: https://gitcode.com/cann/pypto创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/11/11 23:35:29

Flutter表单开发实践:OpenHarmony剧本杀组队应用

1. 项目背景与需求分析在OpenHarmony生态中开发剧本杀组队应用,表单功能是连接玩家需求与组队活动的关键桥梁。这个模块需要解决三个核心问题:如何设计符合剧本杀场景的表单数据结构如何实现跨平台的表单交互体验如何保证表单数据与后端服务的无缝对接我…

2026/11/10 17:35:38

3ds Max真实能力成长路径:从操作到项目交付的五层跃迁

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/11/12 16:06:48

武汉在那里学电工证怎么考?电子证书怎么查?3个真实案例告诉你

武汉在那里学电工证怎么考?电子证书怎么查?3个真实案例告诉你 你是不是正盯着招聘网站上的电工岗位,看到“持有低压电工证”“高压电工证”这类硬性要求,心里发毛?别急,今天咱们就来聊聊【武汉在那里学电工证】,以及如何拿到电子证书,顺利上岗。…

2026/11/12 16:06:48

工地太忙根本没时间复习考试?官方回应陈天云电工证复审怎么搞

工地太忙根本没时间复习考试?官方回应陈天云电工证复审怎么搞 你是不是也遇到过这种情况?工地项目赶工期,天天加班到晚上,根本没时间复习考试,陈天云电工证的复审眼看就要到期了,但心里没底,怕挂了影响工作?官方回应说,其实这类问题有明确的解决方案…

2026/11/12 16:01:47

低压电工证拧线官方回应怕考不过白交培训费?这些避坑经验必须知道

低压电工证拧线官方回应怕考不过白交培训费?这些避坑经验必须知道 怕考不过白交培训费?你不是一个人,我之前带的学员里,有70%都担心这个问题。特别是低压电工证拧线这种实操性极强的证书,很多人以为只要参加培训就一定能过,结果因为没掌握好要点,白…

2026/11/11 12:42:59

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/12 0:04:01

工地太忙根本没时间复习考试?学习电工证到哪里学通过率揭秘

工地太忙根本没时间复习考试?学习电工证到哪里学通过率揭秘 工地太忙根本没时间复习考试?你不是一个人。作为一名在南阳卧龙区干了七八年市政公用工程的电工,我深知这个问题的现实性。电工证不仅是工作的“入场券”,更是职业发展的“通行证”,但备考过程…

2026/11/12 0:04:01

双流电工证考别怕挂科!郑州报考避坑指南全攻略

双流电工证考别怕挂科!郑州报考避坑指南全攻略 实操考试心里没底怕挂科?双流电工证考在郑州报名,很多人因为不了解流程、准备不充分,白白浪费时间和金钱。作为三门峡应届工程类毕业生,我也曾经历过这样的焦虑。今天就从零开始,手把手教你如何避开郑州报…

2026/11/12 0:04:01

之前考的证在外省能不能转过来 怎么报名考电工证培训价格多少

之前考的证在外省能不能转过来 怎么报名考电工证培训价格多少 之前考的证在外省能不能转过来?这个问题确实让不少准备换城市工作的朋友犯了难,尤其像电工证这种实操性很强的证书,很多人担心跨省后证书能不能继续用。其实,只要符合相关流程,是可以顺利转…

2026/11/11 20:27:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/12 9:51:42

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑