pyasc 数据搬运优化:asc.language.basic.set_load_data_repeat 接口使用指南 📅 发布时间:2026/9/18 23:50:01 👁 浏览次数: pyasc 数据搬运优化asc.language.basic.set_load_data_repeat 接口使用指南【免费下载链接】pyasc本项目为Python用户提供算子编程接口支持在昇腾AI处理器上加速计算接口与Ascend C一一对应并遵守Python原生语法。项目地址: https://gitcode.com/cann/pyascasc.language.basic.set_load_data_repeat是 CANN pyasc 项目中用于配置load_3d_v2数据搬运接口 repeat 行为的编程接口。通过设置 repeat 参数开发者可以用一次load_3d_v2调用完成多次迭代的数据搬运显著减少指令发射开销是昇腾 AI 处理器 Local Memory 数据搬运优化的关键手段之一。读完本文你将掌握LoadDataRepeatParam各字段的含义与取值范围、set_load_data_repeat的调用方式、其与load_3d_v2的配合方法以及它在 pyasc 源码中的实现与测试验证路径。接口概览与核心作用set_load_data_repeat属于 asc.language.basic 模块用于设置load_3d_v2接口的 repeat 参数。它的核心价值在于设置 repeat 参数后可以通过调用一次load_3d_v2接口完成多个迭代的数据搬运避免在 kernel 中重复书写多条搬运指令。从 mm.py 的源码可以看出该接口的 Python 定义非常简洁本质上是向 IR 构建器下发一条SetLoadDataRepeat指令overload def set_load_data_repeat(param: LoadDataRepeatParam) - None: ... require_jit set_common_docstring(api_nameset_load_data_repeat) def set_load_data_repeat(param: LoadDataRepeatParam) - None: builder global_builder.get_ir_builder() param_ir param.to_ir() builder.create_asc_SetLoadDataRepeatOp(param_ir)接口签名asc.language.basic.set_load_data_repeat(param: LoadDataRepeatParam) → None其对应的 Ascend C 函数原型为__aicore__ inline void SetLoadDataRepeat(const LoadDataRepeatParam repeatParams)接口使用前提是处于asc.jit装饰的 kernel 函数上下文中见下文调用示例因为require_jit装饰器要求必须有活动的 JIT 编译上下文才能通过global_builder获取 IR 构建器。参数结构LoadDataRepeatParamset_load_data_repeat的唯一入参是LoadDataRepeatParam类型。该类型在 types.py 中定义为IRValue的子类构造时通过create_asc_ConstructOp将三个字段按uint8 / uint16 / uint8的类型顺序封装为一个 IR 值class LoadDataRepeatParam(IRValue): overload def __init__(self, repeat_time: int 1, repeat_stride: int 0, repeat_mode: int 0) - None: ... require_jit def __init__(self, repeat_time: RuntimeInt 1, repeat_stride: RuntimeInt 0, repeat_mode: RuntimeInt 0, handle: Optional[IRHandle] None) - None: ... self.handle builder.create_asc_ConstructOp( builder.get_asc_LoadDataRepeatParamType(), [ _mat(repeat_time).to_ir(), _mat(repeat_stride).to_ir(), _mat(repeat_mode).to_ir(), ], builder.get_type_array_attr([builder.get_ui8_type(), builder.get_ui16_type(), builder.get_ui8_type()]), )对应的 IR 类型声明位于 Types.td其 mnemonics 为load_data_repeat_paramAPI 名称对应AscendC::LoadDataRepeatParamdef LoadDataRepeatParam : APITypeLoadDataRepeatParam { let mnemonic load_data_repeat_param; let apiName AscendC::LoadDataRepeatParam; }字段说明字段含义取值范围默认值repeat_timeheight/width 方向上的迭代次数[0, 255]1repeat_strideheight/width 方向上前一个迭代与后一个迭代起始地址的距离[0, 65535]0repeat_mode控制 repeat 迭代的方向[0, 1]0各字段的详细语义如下repeat_timeheight/width 方向上的迭代次数取值范围repeatTime ∈ [0, 255]默认值为 1。例如设置为 4则表示一次load_3d_v2调用将连续搬运 4 个迭代的数据块。repeat_strideheight/width 方向上前一个迭代与后一个迭代起始地址之间的距离取值范围n ∈ [0, 65535]默认值为 0。需要注意单位随repeat_mode变化repeat_mode为 0 时repeat_stride的单位为16 个元素即 16 个数据元素为一步repeat_mode为 1 时repeat_stride的单位和具体芯片型号有关需要结合目标硬件的文档确认。repeat_mode控制 repeat 迭代的方向取值范围k ∈ [0, 1]默认值为 00迭代沿height方向1迭代沿width方向。源码中的类型编码佐证LoadDataRepeatParam三个字段在 IR 中分别被编码为uint8repeat_time、uint16repeat_stride、uint8repeat_mode这与文档中给出的取值范围0~255、0~65535、0~1完全吻合uint8最大可表示 255uint16最大可表示 65535。该参数类型也被用于 OpMm.td 中SetLoadDataRepeat指令的操作数定义def AscendC_SetLoadDataRepeatOp : APIOpset_load_data_repeat, SetLoadDataRepeat, [AscFunc] { let arguments (ins AscendC_LoadDataRepeatParam:$repeatParams); }调用示例文档给出的标准调用方式如下先构造LoadDataRepeatParam参数对象再将其传给set_load_data_repeatimport asc static_param asc.LoadDataRepeatParam( repeatTime4, repeatStride8, repeatMode0 ) asc.set_load_data_repeat(static_param)与 load_3d_v2 配合的完整 kernel 写法需要指出的是示例中的参数名写法repeatTime/repeatStride/repeatMode是文档化的字段名写法而在 pyasc 的实际 Python 源码中构造函数关键字参数为小写蛇形命名repeat_time、repeat_stride、repeat_mode见 types.py。因此在实际可运行的 kernel 中应写成import asc asc.jit def load_repeat_kernel(x: asc.GlobalAddress) - None: # 在 VECIN 上声明输入 LocalTensor x_local asc.LocalTensor(dtypeasc.float16, posasc.TPosition.VECIN, addr0, tile_size512) y_local asc.LocalTensor(dtypeasc.float16, posasc.TPosition.VECOUT, addr0, tile_size512) # 构造 load_3d_v2 的搬运参数 params_3d_v2 asc.LoadData3DParamsV2( [0, 0, 0, 0], 16, 16, 16, 16, 16, 0, 0, 1, 1, 3, 3, 1, 1, False, 0, False, False, False, ) # 设置 repeat一次搬运完成 4 个迭代步长 8 个单位沿 height 方向 repeat_param asc.LoadDataRepeatParam( repeat_time4, repeat_stride8, repeat_mode0, ) asc.set_load_data_repeat(repeat_param) # 一次调用完成多迭代数据搬运 asc.load_data(y_local, x_local, params_3d_v2) load_repeat_kernel1上例中LoadData3DParamsV2的构造方式参考了 load_data 接口文档 中 Local Memory 内部 3D 搬运LoadData3DParamsV2的示例写法set_load_data_repeat必须在asc.load_dataV2 版本调用之前设置才能对后续的load_3d_v2搬运生效。注意事项set_load_data_repeat需要配合load_3d_v2接口使用文档中约束说明明确该接口无额外约束。repeat_time为 0 或默认值 1 时表示不启用多迭代搬运或仅搬运一次此时接口退化为普通单次搬运语义。当repeat_mode为 1 且目标芯片型号不同时repeat_stride的单位可能不同跨型号移植代码时需要重新核对步长语义。底层实现与调用链从调用链看set_load_data_repeat的 Python 层到最终代码发射的路径如下Python API 层asc.set_load_data_repeat(param)通过 mm.py 将param.to_ir()传给builder.create_asc_SetLoadDataRepeatOp。IR 构建层create_asc_SetLoadDataRepeatOp创建AscendC_SetLoadDataRepeatOp指令见 OpMm.td该指令携带AscendC_LoadDataRepeatParam类型参数。代码发射层IR 最终被 Target 层翻译为 Ascend C 代码中的SetLoadDataRepeat(const LoadDataRepeatParam repeatParams)函数调用对应文档给出的 C 原型并最终由编译器生成昇腾 AI 处理器可执行的指令。整个调用链体现了 pyasc 的设计理念Python 原生语法 与 Ascend C 一一对应的算子编程接口——开发者写 Python底层自动生成与 Ascend C 等价的 IR 与代码。单元测试验证pyasc 仓库在 test_mm.py 中提供了针对set_load_data_repeat的单元测试用于验证接口在 JIT 编译链路中的正确性def test_set_load_data_repeat(mock_launcher_run): asc.jit def set_load_data_repeat_kernel(): static_param asc.LoadDataRepeatParam( repeat_time4, repeat_stride8, repeat_mode0, ) asc.set_load_data_repeat(static_param) set_load_data_repeat_kernel[1]() assert mock_launcher_run.call_count 1该测试的核心断言逻辑是通过asc.jit将 kernel 函数进行 JIT 编译并启动在 kernel 内部构造LoadDataRepeatParam(repeat_time4, repeat_stride8, repeat_mode0)并调用set_load_data_repeat最后断言mock_launcher_run.call_count 1即整个 kernel 只被启动一次验证接口在编译链路上无异常。注意该测试中set_load_data_repeat仅验证接口本身的编译与发射未与load_3d_v2联合验证实际数据搬运结果在实际算子开发中仍需结合load_dataV2 版本进行端到端验证。该测试同时印证了 Python 层构造参数使用repeat_time/repeat_stride/repeat_mode小写蛇形命名的写法。与同系列 load 配置接口的关系set_load_data_repeat是 pyasc 中围绕load_3d_v1/load_3d_v2搬运指令的一组配置接口之一同系列接口还包括set_load_data_boundary设置搬运边界值用于load_3d_v1时单位是 32 字节用于load_3d_v2时单位是字节。set_load_data_padding_value设置 Pad 填充数值仅当load_3d_v1/load_3d_v2模板参数isSetPadding为 true 时生效。这三个接口在源码 mm.py 中集中定义分别对应 IR 层的AscendC_SetLoadDataBoundaryOp、AscendC_SetLoadDataPaddingValueOp、AscendC_SetLoadDataRepeatOp三条指令共同构成 3D 数据搬运的完整配置体系边界控制搬运范围、填充值控制越界数据、repeat 控制迭代批量搬运。三者均在调用load_data3D 版本之前设置。小结asc.language.basic.set_load_data_repeat是 pyasc 为昇腾 AI 处理器 3D 数据搬运提供的重要优化接口。通过LoadDataRepeatParam中的repeat_time、repeat_stride、repeat_mode三个字段开发者可以用一次load_3d_v2调用完成多个迭代的批量搬运并精确控制迭代次数、步长与方向。在 pyasc 中它通过 mm.py 下发 IR、经 OpMm.td 定义指令、最终翻译为 Ascend C 的SetLoadDataRepeat调用test_mm.py 中的单元测试则为该接口的编译链路提供了验证依据。对于需要频繁迭代搬运数据块如卷积滑窗、分块矩阵搬运的算子合理设置 repeat 参数可以有效减少指令数量、提升搬运效率。【免费下载链接】pyasc本项目为Python用户提供算子编程接口支持在昇腾AI处理器上加速计算接口与Ascend C一一对应并遵守Python原生语法。项目地址: https://gitcode.com/cann/pyasc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考