 获取张量描述列表数据指针个数)
CANN pyasc 算子编程接口解析ListTensorDesc.get_size() 获取张量描述列表数据指针个数【免费下载链接】pyasc本项目为Python用户提供算子编程接口支持在昇腾AI处理器上加速计算接口与Ascend C一一对应并遵守Python原生语法。项目地址: https://gitcode.com/cann/pyasc本文以 CANN pyasc 项目为 Python 开发者提供与 Ascend C 一一对应、遵循 Python 原生语法的昇腾算子编程接口中的asc.language.basic.ListTensorDesc.get_size()接口为切入点系统讲解ListTensorDesc在 Kernel 侧解析全局内存中连续存放的张量描述列表时的作用、get_size()的签名与语义、底层 IR 生成实现及配套测试用例并给出可直接运行的完整调用示例帮助开发者快速掌握在 pyasc 中遍历张量描述列表的编程模式。一、接口背景ListTensorDesc 与张量描述列表在昇腾算子 Kernel 开发中经常需要处理一组张量描述连续存放在同一块全局内存的场景例如动态 shape 算子的输入元数据区。Ascend C 通过ListTensorDesc类对该内存排布进行解析将首地址、内存长度与数据指针个数等元信息封装为一个可索引的张量描述列表对象。CANN pyasc 在 python/asc/language/basic/list_tensor.py 中实现了同名的 Python 类ListTensorDesc继承自IRValue与asc.language.basic命名空间下的 TensorDesc单个张量描述互为补充TensorDesc描述单个张量的维度、shape、数据地址等信息ListTensorDesc描述一组 TensorDesc 在内存中的连续排布支持按 index 取出单个描述get_desc、取出数据指针get_data_ptr以及查询数据指针个数get_size。在 docs/python-api/language/basic.md 的 TensorDesc operations 一节中ListTensorDesc提供了三种构造方式asc.ListTensorDesc() # 空对象后续调用 init() asc.ListTensorDesc(dataGlobalAddress, lengthint4294967295, shape_sizeint4294967295) asc.ListTensorDesc(handleValue) # 由 IR handle 构造不建议用户直接调用其中默认值4294967295即十六进制0xffffffff与 Ascend C 原型中的uint32_t length 0xffffffff, uint32_t shapeSize 0xffffffff一致表示不限制的默认语义。二、get_size() 接口定义与语义关联文档 asc.language.basic.ListTensorDesc.get_size.md 对该接口的定义如下ListTensorDesc.get_size() → int功能获取ListTensor中包含的数据指针的个数。参数说明无。返回值说明数据指针的个数。对应的 Ascend C 函数原型__aicore__ inline uint32_t GetSize()即该 Python 接口是对 Ascend CGetSize()的一一映射返回值对应 C 侧的无符号 32 位整数uint32_t。可以推断这个数据指针个数正是构造ListTensorDesc时shape_size参数所描述的信息——它表示该内存排布中一共存放了多少个张量描述每个描述对应一个数据指针是后续按 index 遍历读取各张量信息的上界。调用示例来自原文档x_desc asc.ListTensorDesc(datax, length0xffffffff, shape_size0xffffffff) x_size x_desc.get_size()三、源码级实现get_size() 如何生成 IRget_size()在 pyasc 中的实现位于 python/asc/language/basic/list_tensor.pyoverload def get_size(self) - int: ... require_jit set_tensor_docstring(tensor_nameListTensorDesc, api_nameget_size) def get_size(self) - RuntimeInt: builder global_builder.get_ir_builder() self.handle builder.create_asc_ListTensorDescGetSizeOp(builder.get_ui32_type(), self.to_ir())从源码结构可以梳理出该接口的完整执行链路装饰器require_jit确保get_size()只能在asc.jit装饰的 Kernel 函数JIT 编译上下文中调用此时global_builder.get_ir_builder()返回当前正在构建的 IR Buildercreate_asc_ListTensorDescGetSizeOp在 IR 中创建一个asc.asc_ListTensorDescGetSize操作输入是当前ListTensorDesc对象通过self.to_ir()拿到其 IR handle结果类型builder.get_ui32_type()显式指定该操作返回ui32无符号 32 位类型的值与 Ascend C 原型中uint32_t GetSize()的返回类型严格对应返回值封装为RuntimeIntPlainValue(handle)将 IR 值包装为运行时整数值可在 Kernel 侧参与循环计数、条件判断等标量运算。与兄弟接口对比可见一致性get_data_ptr 使用ir.get_unranked_memref_type(dtype.to_ir(), ir.AddressSpace.gm)构造指向 Global Memory 的地址类型并返回GlobalAddress而get_size不依赖具体数据类型直接返回无符号整数正因为它描述的是指针个数这一元信息与元素类型无关。四、配套测试用例验证仓库在 python/test/unit/language/basic/test_list_tensor.py 中提供了get_size()的单元测试def test_get_size(mock_launcher_run): asc.jit def kernel_get_size(x: asc.GlobalAddress) - None: x_desc asc.ListTensorDesc(datax, length0xffffffff, shape_size0xffffffff) x_size x_desc.get_size() x MockTensor(asc.uint8) kernel_get_size1 assert mock_launcher_run.call_count 1该测试揭示了几个关键事实get_size()必须在asc.jit装饰的 Kernel 函数内调用配合MockTensor(asc.uint8)模拟全局内存输入属于 pyasc 的 Model 后端config.set_platform(config.Backend.Model, ...)离线仿真验证路径测试覆盖的是构造ListTensorDesc后立即调用get_size()的最小调用序列验证 IR 构建与 Kernel 启动流程无异常同文件中 test_get_desc、test_get_data_ptr 等用例共同构成对ListTensorDesc各查询接口的回归保障。五、实战结合 get_size 遍历张量描述列表get_size()的典型用途是为遍历提供上界。下面给出一个完整的 Kernel 侧使用模式综合ListTensorDesc的四个核心接口构造、取描述、取指针、取个数import asc asc.jit def parse_tensor_list(x: asc.GlobalAddress) - None: # 1. 基于全局内存首地址构造张量描述列表 x_desc asc.ListTensorDesc(datax, length0xffffffff, shape_size0xffffffff) # 2. 获取数据指针个数作为遍历上界 size x_desc.get_size() # 3. 依次取出每个张量描述 for i in range(size): # size 为 RuntimeInt可用于运行时循环 desc asc.TensorDesc() x_desc.get_desc(desc, indexi) # 将第 i 个描述解析到 desc dim desc.get_dim() # 获取该张量的维度 ptr x_desc.get_data_ptr(indexi, dtypeasc.float16) # 直接取第 i 个数据指针两种取数据的路径各有适用场景方式接口适用场景先取描述再取数据get_desc(desc, index)TensorDesc.get_data_ptr()需要维度、shape 等完整描述信息直接取数据指针get_data_ptr(index, dtype)只需数据地址且已知数据类型也可以先创建空对象再调用 init 完成解析效果与直接构造等价x_desc asc.ListTensorDesc() x_desc.init(datax, length0xffffffff, shape_size0xffffffff) size x_desc.get_size()六、使用约束与注意事项综合接口文档与源码实现使用get_size()时需注意必须在 JIT Kernel 上下文内调用require_jit保证该接口只在asc.jit函数内有效否则无法获取 IR Builder返回值类型Python 侧声明返回int底层为ui32类型 IR 值可参与循环与条件判断但不宜当作任意精度大整数使用与构造参数shape_size的对应关系get_size()返回的即构造或init时传入的shape_size所表达的数据指针个数信息该参数默认0xffffffff表示不限制实际使用时建议传入准确的指针个数以保证遍历边界正确配套接口的成对使用get_desc/get_data_ptr均以index为参数合理的编程实践是先用get_size()取得个数再以[0, size)为界进行索引访问避免越界读取未定义内存。七、相关资源索引接口主文档asc.language.basic.ListTensorDesc.get_size.md类总览docs/python-api/language/basic.mdTensorDesc operations 一节同族接口init、get_desc、get_data_ptr源码实现python/asc/language/basic/list_tensor.py单元测试python/test/unit/language/basic/test_list_tensor.py通过本文可以看出pyasc 对 Ascend C 的ListTensorDesc家族接口做到了函数原型、返回类型与语义的严格对齐get_size()的uint32_t GetSize()→ui32IR 类型 → Pythonint的映射链路清晰完整开发者可以像编写原生 Python 一样安全地在 Kernel 侧解析和遍历张量描述列表。【免费下载链接】pyasc本项目为Python用户提供算子编程接口支持在昇腾AI处理器上加速计算接口与Ascend C一一对应并遵守Python原生语法。项目地址: https://gitcode.com/cann/pyasc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考