pyasc 中 get_task_ratio 接口详解:AI Core 任务比例获取与混合流水 Kernel 的核心编号映射 📅 发布时间:2026/9/18 3:43:46 👁 浏览次数: pyasc 中 get_task_ratio 接口详解AI Core 任务比例获取与混合流水 Kernel 的核心编号映射【免费下载链接】pyasc本项目为Python用户提供算子编程接口支持在昇腾AI处理器上加速计算接口与Ascend C一一对应并遵守Python原生语法。项目地址: https://gitcode.com/cann/pyasc本文围绕 pyasc 项目的asc.language.basic.get_task_ratio()接口展开系统讲解其在分离/耦合模式下获取单个 AI Core 上 Cube CoreAIC与 Vector CoreAIV数量比例的语义、不同 Kernel 类型下的返回值规则以及它在混合流水算子如 fused_infer_attention 示例中用于逻辑 Core 编号映射的实际用法帮助读者在编写昇腾 NPU 算子时正确利用该接口做核间任务划分。接口概述get_task_ratio()是 pyasc 语言层asc.language.basic模块提供的一个无参运行时查询接口其原型为asc.language.basic.get_task_ratio() → int它对应的 Ascend C 函数原型为__aicore__ inline int64_t GetTaskRatio();两者的语义完全一致分离模式下返回一个 AI Core 上 Cube CoreAIC或者 Vector CoreAIV的数量与 AI Core 数量的比例。例如在 MIX_AIC_1_2 类型的 Kernel 中一个 AI Core 承载 1 个 AIC 和 2 个 AIV因此在 AIV 侧调用该接口返回 2在 AIC 侧返回 1耦合模式下AIC 与 AIV 一一绑定该比例恒为 1接口固定返回 1。该接口没有任何输入参数也没有额外约束说明属于即调即得的轻量查询。它在 pyasc 中的 Python 实现位于 sys_var.py源码如下overload def get_task_ratio() - int: ... require_jit set_common_docstring(api_nameget_task_ratio) def get_task_ratio() - RuntimeInt: return PlainValue(global_builder.get_ir_builder().create_asc_GetTaskRatioOp(KnownTypes.int64.to_ir()))从源码结构看该函数有两个关键特征require_jit装饰器表明它只能在asc.jit编译上下文JIT 编译期中调用用于在 IR 构建阶段插入一个查询节点而不在 Python 解释执行期真正取值函数体通过create_asc_GetTaskRatioOp直接创建一个 Asc 方言的 IR Op并以int64类型标注结果类型与 Ascend C 原型中的int64_t返回值保持对应再包裹为PlainValueRuntimeInt类型返回供后续参与 IR 层的算术运算。也就是说get_task_ratio()的返回值本质上是编译期 IR 中的一个值节点可以在 Python 代码里直接参与整除、乘除等表达式如asc.get_block_idx() // asc.get_task_ratio()最终由编译器统一处理到目标硬件的GetTaskRatio()调用。接口文档的 docstring 文本由 utils.py 中的get_task_ratio_docstring()集中生成并通过set_common_docstring注入到各导出处保证文档、API 参考页asc.language.basic.get_task_ratio.md与运行时行为来自同一份描述。返回值说明Kernel 类型决定比例接口最核心的信息是返回值与 Kernel 类型的对应关系。针对分离模式不同 Kernel 类型下通过设置 Kernel 类型指定在 AIC 和 AIV 上调用该接口的返回值如下表所示表1 返回值列表Kernel 类型KERNEL_TYPE_AIV_ONLYKERNEL_TYPE_AIC_ONLYKERNEL_TYPE_MIX_AIC_1_2KERNEL_TYPE_MIX_AIC_1_1KERNEL_TYPE_MIX_AIC_1_0KERNEL_TYPE_MIX_AIV_1_0AIV1211AIC1111表中“”表示该侧不存在、无法调用例如 AIV_ONLY 类型下没有 AICAIC_ONLY 类型下没有 AIV。针对耦合模式固定返回 1。结合这些 Kernel 类型的命名可以读出清晰的语义KERNEL_TYPE_AIV_ONLY/KERNEL_TYPE_AIC_ONLY纯 Vector 或纯 Cube 流水一侧缺席存活侧比例为 1KERNEL_TYPE_MIX_AIC_1_21 个 AIC 对应 2 个 AIVAIV 侧返回 2AIC 侧返回 1KERNEL_TYPE_MIX_AIC_1_1AIC 与 AIV 数量 1:1两侧均返回 1KERNEL_TYPE_MIX_AIC_1_0/KERNEL_TYPE_MIX_AIV_1_0仅一侧参与混合调度参与侧返回 1缺席侧无法调用。这些命名与 pyasc 运行时的枚举定义一一对应。在 config.py 中KernelType枚举给出了完整的取值集合class KernelType(Enum): AIV_ONLY 0 AIC_ONLY 1 MIX_AIV_HARD_SYNC 2 MIX_AIC_HARD_SYNC 3 MIX_AIV_1_0 4 MIX_AIC_1_0 5 MIX_AIC_1_1 6 MIX_AIC_1_2 7此外compiler.py 中的编译流程展示了 Kernel 类型如何被确定当用户未显式指定时编译器会读取 IR 上的kernel_type属性mixed/vector/cube推断——例如mixed会进一步根据matmul_cube_only选项落地为AIC_ONLY或MIX_AIC_1_2。这解释了为什么返回值表只列出了部分类型get_task_ratio()的语义只与“一个 AI Core 上 AIC/AIV 的配比”相关而这一配比正是由上述 Kernel 类型决定的。实战用法从 Block 编号映射到逻辑 Core 编号get_task_ratio()最典型的使用场景是在混合流水MIXKernel 中把全局 BlockAICore编号换算为逻辑 Core 编号。pyasc 仓库中的 fused_infer_attention 示例 给出了一个完整的真实用例asc.jit( matmul_cube_onlyTrue, kernel_typeconfig.KernelType.MIX_AIC_1_2, ) def fused_infer_attention_kernel(...): core_idx asc.get_block_idx() // asc.get_task_ratio() ... if asc.ascend_is_aiv(): if task_begin task_end: ... # AIV 处理路径 if asc.ascend_is_aic(): if task_begin task_end: ... # AIC 处理路径其工作原理可以从源码结构看得到该 Kernel 以MIX_AIC_1_2类型编译即每个 AI Core 上有 1 个 AIC 2 个 AIV共 3 个可调度单元。当任务按“AI Core”为粒度切分时asc.get_block_idx()返回当前线程AIC 或 AIV在全芯片范围内的线性编号asc.get_task_ratio()在 AIV 上返回 2、在 AIC 上返回 1执行整除后同一 AI Core 上的 3 个线程被折叠到同一个core_idx后续用asc.ascend_is_aic()/asc.ascend_is_aiv()区分线程角色让同一逻辑 Core 内的 AIC 与 AIV 分别执行 Cube 计算路径QK/PV 矩阵乘和 Vector 计算路径Softmax 等并通过 GM 上的中间张量score_gm、prob_gm、partial_gm等协作。这正体现了get_task_ratio()的设计意图它不是为了“知道硬件长什么样”而是为“按 AI Core 粒度切任务、按 AIC/AIV 角色分工”的混合编程模型提供编号折叠原语。类似的get_block_idx()、get_block_num()等核内变量查询接口同属 sys_var.py 文件它们共同构成了 pyasc 中设备侧系统变量查询的完整集合。使用注意与适用前提调用上下文接口带require_jit约束必须在asc.jit装饰的 Kernel 函数体内调用或作为其依赖表达式参与 IR 构建不能在普通 Python 环境中直接求值其返回的RuntimeInt是编译期值可用于整除、下标等 IR 层运算模式差异在耦合模式下接口恒返回 1此时“折叠编号”操作是幂等的混合编程代码可以直接沿用同一套写法在分离模式下返回值随 Kernel 类型变化编写依赖比例逻辑如上述整除折叠的代码时需保证 Kernel 类型与逻辑假设一致类型对应Python 侧返回类型标注为int底层 IR 与 Ascend C 原型均为int64语义参与大数运算时无需担心位宽问题验证方式接口行为可通过文档中的最小示例快速确认示例代码位于 docs/python-api/language/generated/asc.language.basic.get_task_ratio.mdimport asc ratio asc.get_task_ratio()更完整的端到端用法可参考 examples/10_fused_infer_attention 中的fused_infer_attention_kernel该示例同时演示了 Kernel 类型指定、角色分支和逻辑 Core 编号折叠的完整链路。综上get_task_ratio()虽是一个无参的小接口却是 pyasc 混合流水算子开发中任务划分的关键原语理解“AI Core : AIC : AIV”三者的比例关系并结合 Kernel 类型返回值表正确使用它是编写正确、高效的 Cube/Vector 协同算子的基础。【免费下载链接】pyasc本项目为Python用户提供算子编程接口支持在昇腾AI处理器上加速计算接口与Ascend C一一对应并遵守Python原生语法。项目地址: https://gitcode.com/cann/pyasc创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考