ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

CANN pyasc 算子编程指南:使用 `asc.language.basic.get_mrg_sort_result` 获取 mrg_sort 队列处理进度

CANN pyasc 算子编程指南:使用 `asc.language.basic.get_mrg_sort_result` 获取 mrg_sort 队列处理进度 CANN pyasc 算子编程指南使用asc.language.basic.get_mrg_sort_result获取 mrg_sort 队列处理进度【免费下载链接】pyasc本项目为Python用户提供算子编程接口支持在昇腾AI处理器上加速计算接口与Ascend C一一对应并遵守Python原生语法。项目地址: https://gitcode.com/cann/pyascasc.language.basic.get_mrg_sort_result是 CANN pyasc 为昇腾 AI 处理器上的 Region Proposal 归并排序流程提供的状态查询接口用于读取mrg_sort/mrg_sort4指令已经处理过的各输入队列中的 Region Proposal 个数。本文以该接口的官方 API 文档docs/python-api/language/generated/asc.language.basic.get_mrg_sort_result.md为主体结合仓库中 Python 前端、MLIR 方言定义、代码生成器与单元测试的源码实现讲解其函数签名、与mrg_sort指令的配合方式、返回值语义及完整可运行的调用示例。读完本文你将能够在自己的 pyasc 算子中正确使用该接口实现基于队列耗尽即停模式的多路有序队列归并与处理进度统计。接口定位与核心作用get_mrg_sort_result是 pyasc 在asc.language.basic命名空间下提供的无参查询函数函数签名如下asc.language.basic.get_mrg_sort_result() - tuple[int, int, int, int]它用于获取mrg_sort已经处理过的队列里的 Region Proposal 个数并依次存储在四个出参中。该接口本身不执行任何排序操作而是配合归并排序指令使用在调用mrg_sort或mrg_sort4之后通过它读出每个输入队列中被实际处理归并掉的元素数量从而让上层逻辑例如下一轮取数、动态循环控制精确掌握排序进度。在 pyasc 的包结构中该接口在 python/asc/language/basic/init.py 中被导出并经由 python/asc/language/init.py 汇总到顶层asc命名空间因此内核代码中可以直接写作asc.get_mrg_sort_result()。与 mrg_sort 指令的配合关系get_mrg_sort_result的返回值是否有意义取决于mrg_sort/mrg_sort4指令是否在队列耗尽即停exhausted suspension模式下运行。官方文档明确了以下两种配合方式配合mrg_sort4指令使用获取mrg_sort4指令处理过的队列里的 Region Proposal 个数。使用时需要将mrg_sort4中的mrg_sort4_info.if_exhausted_suspension参数配置为True该配置模式下某条队列耗尽后mrg_sort4指令即停止。适用于Atlas 推理系列产品 AI Core。配合mrg_sort指令使用获取mrg_sort指令处理过的队列里的 Region Proposal 个数。使用时需要将mrg_sort中的mrg_sort_4_info.if_exhausted_suspension参数配置为True该配置模式下某条队列耗尽后mrg_sort指令即停止。适用于Atlas A3 训练系列产品 / Atlas A3 推理系列产品Atlas A2 训练系列产品 / Atlas A2 推理系列产品Atlas 200I/500 A2 推理产品也就是说该接口的典型使用场景是当某一条输入队列先被排空、归并指令提前停止时调用方需要知道每条队列各自已经处理了多少以决定后续批次的数据搬运与拼接逻辑。这一语义在 pyasc 的 docstring 生成器中得到了原样保留见 python/asc/language/basic/utils.py 中get_mrg_sort_result_docstring()的实现。对应的 Ascend C 函数原型该接口与 Ascend C 接口一一对应底层最终生成如下 C 调用__aicore__ inline void GetMrgSortResult(uint16_t mrgSortList1, uint16_t mrgSortList2, uint16_t mrgSortList3, uint16_t mrgSortList4)注意与 Python 版不同的是Ascend C 版本通过四个uint16_t引用参数回传结果而 pyasc 版本将其包装为四个返回值构成的tuple[int, int, int, int]。代码生成器在 lib/Target/AscendC/Basic/OtherOps.cpp 中会先为每个结果声明uint16_t局部变量再调用AscendC::GetMrgSortResult(...)依次填充最终由 Python 端还原为四个返回值。参数与返回值说明参数说明无。该接口不接受任何参数其处理进度信息直接由 AI Core 硬件维护。返回值说明返回值类型含义mrg_sort_list1第一个返回值uint16_tmrg_sort第一个队列里已经处理过的 Region Proposal 个数mrg_sort_list2第二个返回值uint16_tmrg_sort第二个队列里已经处理过的 Region Proposal 个数mrg_sort_list3第三个返回值uint16_tmrg_sort第三个队列里已经处理过的 Region Proposal 个数mrg_sort_list4第四个返回值uint16_tmrg_sort第四个队列里已经处理过的 Region Proposal 个数四个返回值一一对应归并排序的四个输入队列队列数量不足四条时未使用的队列对应返回值语义上仍按该队列实际处理数统计。返回值以uint16_t承载处理元素个数超出该范围的情况需结合具体算子规模评估。约束说明无。完整调用示例官方文档给出的调用示例覆盖了mrg_sort的两种重载形式显式参数形式与MrgSort4Info封装形式以及最后的进度查询。为了便于直接运行下面补全了示例中缺失的sort_list构建语句MrgSortSrcList的构造签名见 python/asc/language/core/tensor.pysrc1 asc.LocalTensor(dtypeasc.float16, posasc.TPosition.VECIN, addr0, tile_size512) src2 asc.LocalTensor(dtypeasc.float16, posasc.TPosition.VECIN, addr512, tile_size512) src3 asc.LocalTensor(dtypeasc.float16, posasc.TPosition.VECIN, addr1024, tile_size512) src4 asc.LocalTensor(dtypeasc.float16, posasc.TPosition.VECIN, addr1536, tile_size512) dst asc.LocalTensor(dtypeasc.float16, posasc.TPosition.VECOUT, addr0, tile_size2048) sort_list asc.MrgSortSrcList(asc.float16, src1, src2, src3, src4) element_count_list [128, 128, 128, 128] sorted_num [0, 0, 0, 0] asc.mrg_sort(dst, sort_list, element_count_list, sorted_num, valid_bit15, repeat_time1) asc.mrg_sort(dst, sort_list, element_count_list, sorted_num, valid_bit15, repeat_time1, is_exhausted_suspensionTrue) mrg_sort4_info asc.MrgSort4Info(element_count_list, if_exhausted_suspensionFalse, valid_bit7, repeat_times1) asc.mrg_sort(dst, sort_list, mrg_sort4_info) mrg1, mrg2, mrg3, mrg4 asc.get_mrg_sort_result()示例要点四个输入src1~src4均为float16的LocalTensor按地址 0/512/1024/1536 依次排布在VECIN位置输出dst为VECOUT位置的float16张量tile_size2048用于容纳归并结果。element_count_list [128, 128, 128, 128]表示四个队列各自包含 128 个元素sorted_num为uint32类型的累计已处理计数初始为 0。第二次mrg_sort调用显式传入is_exhausted_suspensionTrue此时某条队列耗尽后指令即停止之后调用get_mrg_sort_result()读到的四个值即为各队列的实际处理个数。第三种调用通过MrgSort4Info封装参数MrgSort4Info(element_lengths, if_exhausted_suspensionFalse, valid_bit15, repeat_times1)的默认参数见 python/asc/language/core/types.py其中if_exhausted_suspension默认为False需要队列耗尽即停语义时须显式置为True。底层实现从 Python 前端到 Ascend C 代码生成get_mrg_sort_result的 Python 前端实现位于 python/asc/language/basic/proposal.pyoverload def get_mrg_sort_result() - tuple[int, int, int, int]: ... require_jit set_common_docstring(get_mrg_sort_result) def get_mrg_sort_result() - Tuple[RuntimeInt, RuntimeInt, RuntimeInt, RuntimeInt]: builder global_builder.get_ir_builder() arg1, arg2, arg3, arg4 builder.create_asc_GetMrgSortResults(KT.uint16.to_ir(), KT.uint16.to_ir(), KT.uint16.to_ir(), KT.uint16.to_ir()) return PlainValue(arg1), PlainValue(arg2), PlainValue(arg3), PlainValue(arg4)实现要点函数被require_jit修饰只能在asc.jit内核编译上下文中调用编译期由 IR builder 生成GetMrgSortResults指令节点。四个结果均以uint16类型生成对应硬件返回的四路队列计数返回的PlainValue使结果可参与内核内后续的标量计算与控制流判断。在 MLIR 方言层面指令节点由 include/ascir/Dialect/Asc/IR/Basic/OpProposal.td 定义def AscendC_GetMrgSortResultOp : VectorOpget_mrg_sort_result, GetMrgSortResult { let description Get merge sort result; let results (outs AnyType:$mrgSortList1, AnyType:$mrgSortList2, AnyType:$mrgSortList3, AnyType:$mrgSortList4); }同一文件还定义了AscendC_MrgSortOpascendc.mrg_sort归并有序队列、AscendC_MrgSort4Opascendc.mrg_sort4归并有序 Region Proposal 队列与AscendC_MrgSortWithInfoOp带MrgSort4Info参数的mrg_sort重载见 include/ascir/Dialect/Asc/IR/Basic/OpProposal.td。其中MrgSortOp通过UnitAttr:$isExhaustedSuspension属性承载队列耗尽即停开关代码生成时会作为模板参数输出到AscendC::MrgSortdtype, isExhaustedSuspension(...)调用中lib/Target/AscendC/Basic/OtherOps.cpp。由此可以梳理出完整的调用链asc.get_mrg_sort_result() # Python 前端proposal.py └─ asc_GetMrgSortResults Op # IR 指令节点OpProposal.td └─ GetMrgSortResultOp # 代码生成OtherOps.cpp └─ AscendC::GetMrgSortResult(uint16_t, ...)此外Translation.cpp中将GetMrgSortResultOp注册为可翻译指令lib/Target/AscendC/Translation.cppMrgSortSrcList张量列表类型则由 include/ascir/Dialect/Asc/IR/Core/Types.td 与 lib/Target/AscendC/CodeEmitter.cpp 负责类型映射与输出。测试验证仓库中对该接口的验证覆盖了 Python 单元测试与 MLIR 端到端转译测试两个层面Python 单元测试python/test/unit/language/basic/test_common_api.py 中的test_get_mrg_sort_result在asc.jit内核内直接调用asc.get_mrg_sort_result()解包四个返回值并断言mock_launcher_run被调用一次验证了接口在 JIT 编译与内核启动流程中的可用性。MLIR 转译测试test/Target/AscendC/basic/vec_proposal.mlir 中构造ascendc.get_mrg_sort_result指令节点并校验其最终生成AscendC::GetMrgSortResult(v20, v21, v22, v23);形式的 C 代码该文件同时覆盖了ascendc.mrg_sort、ascendc.mrg_sort4与ascendc.mrg_sort_with_info的转译校验。使用建议与注意事项务必与队列耗尽即停模式搭配使用只有在is_exhausted_suspension/if_exhausted_suspension为True时归并指令才会在某一队列耗尽时提前停止此时get_mrg_sort_result返回的四路计数才具有各队列实际处理进度的业务意义否则指令将按repeat_time完整执行查询结果的用途有限。平台差异不可忽略mrg_sort4if_exhausted_suspension的查询能力仅适用于 Atlas 推理系列产品 AI Coremrg_sort的查询能力适用于 Atlas A3 / A2 训练、推理系列产品及 Atlas 200I/500 A2 推理产品。跨平台移植算子时需核对目标平台的指令支持情况。类型为uint16_t返回值可参与内核内的标量运算与动态控制流但要注意计数上限65535超大 batch 场景应结合分块策略使用。在 JIT 上下文中使用该接口与 pyasc 其他算子一样需要位于asc.jit修饰的内核函数内由编译期 IR builder 完成指令下发。【免费下载链接】pyasc本项目为Python用户提供算子编程接口支持在昇腾AI处理器上加速计算接口与Ascend C一一对应并遵守Python原生语法。项目地址: https://gitcode.com/cann/pyasc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表