CANN Runtime 资源限制下下发 Kernel:launch_kernel_with_reslimit 样例全解析

发布时间:2026/9/18 1:26:13

CANN Runtime 资源限制下下发 Kernel:launch_kernel_with_reslimit 样例全解析 CANN Runtime 资源限制下下发 Kernellaunch_kernel_with_reslimit 样例全解析【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime导读本篇文章以 CANN runtime 开源仓库中的 1_launch_kernel_with_reslimit 样例 为核心讲解如何在进程级为 Device 设置计算资源Cube Core上限并在该限制下下发打印 Kernel 的完整流程。读完本文你将掌握aclrtSetDeviceResLimit/aclrtGetDeviceResLimit这对运行时配置接口的用法、与之配套的初始化与资源清理调用链以及如何通过脚本自动化校验资源限制是否真正生效。样例概述在资源限制下执行 Kernel当多个进程或任务共享同一个 Device 时如果不加约束某个任务可能抢占全部 AI Core 资源影响其他任务运行。CANN Runtime 提供进程级 Device 资源限制机制允许业务进程在启动 Kernel 前为当前进程指定可使用的核心数量上限。本样例演示的正是这一能力的基础闭环初始化 ACL选择 Device 0 并创建 Stream调用aclrtSetDeviceResLimit为当前进程设置Cube Core 资源限制值为 8调用aclrtGetDeviceResLimit查询当前限制值以查询到的限制值作为 blockDim 下发打印 Kernel每个 block 打印一条Hello World因此成功运行后共输出 8 条脚本自动校验输出条数是否为 8从而验证资源限制配置在真实下发路径中生效。从源码结构看该机制属于 Runtime 的“运行时配置”能力与 Stream 级资源限制aclrtSetStreamResLimit、线程级资源查询aclrtGetResInCurrentThread同属一套资源限额控制体系。产品支持情况本样例支持以下产品来自 README_en.md产品是否支持Ascend 950PR/Ascend 950DT支持Atlas A3 训练系列产品/Atlas A3 推理系列产品支持Atlas A2 训练系列产品/Atlas A2 推理系列产品支持编译与运行步骤1. 准备环境并切换目录将样例代码下载到已安装 CANN 软件的环境中切换到样例目录cd ${git_clone_path}/example/2_advanced_features/kernel/1_launch_kernel_with_reslimit其中${git_clone_path}为仓库 clone 到本地的路径。2. 设置环境变量# ${install_root} 替换为 CANN 安装根目录默认安装在 /usr/local/Ascend 目录 source ${install_root}/cann/set_env.sh # 自动识别 SOC_VERSION 和 ASCENDC_CMAKE_DIR source ${git_clone_path}/example/set_sample_env.sh第一行导入 CANN 基础环境第二行来自仓库根目录下的 set_sample_env.sh用于自动探测当前芯片的SOC_VERSION以及昇腾算子编译器AscendC的ASCENDC_CMAKE_DIR路径。3. 执行样例bash run.shrun.sh 的完整执行逻辑如下set -euo pipefail开启严格模式任何一步失败立即退出source ${EXAMPLE_DIR}/common/resolve_cann_env.sh解析 CANN 安装路径若环境变量未设置则自动加载set_sample_env.sh探测SOC_VERSION与ASCENDC_CMAKE_DIR两者缺失或ASCENDC_CMAKE_DIR/ascendc.cmake不存在时给出明确报错并退出通过 CMake 配置并编译编译命令可参考 CMakeLists.txt其通过include(${ASCENDC_CMAKE_DIR}/ascendc.cmake)引入昇腾编译框架将kernel_print.cpp编译为kernels静态库再与libacl_rt.so链接生成main可执行文件运行main并将输出通过tee同时写入output_msg.txt统计Hello World出现次数必须恰好为 8才判定成功否则打印失败原因并以非零状态退出。核心 APIDevice 资源限制的读取与设置资源限制类型枚举在 acl_rt.h 中定义了资源限制类型typedef enum { ACL_RT_DEV_RES_CUBE_CORE 0, // Cube CoreAI Core 中的矩阵计算核心资源 ACL_RT_DEV_RES_VECTOR_CORE, // Vector Core向量计算核心资源 } aclrtDevResLimitType;本样例使用ACL_RT_DEV_RES_CUBE_CORE值为 0即限制当前进程可用的 Cube Core 数量。设置资源限制aclrtSetDeviceResLimit接口声明见 acl_rt.h/** * brief Set the value of the current devices limited resources * param [in] deviceId the device id * param [in] type resource type * param [in] value resource limit value * retval ACL_SUCCESS The function is successfully executed. * retval OtherValues Failure */ ACL_FUNC_VISIBILITY aclError aclrtSetDeviceResLimit(int32_t deviceId, aclrtDevResLimitType type, uint32_t value);参数说明deviceId目标 Device 的 IDtype资源类型取aclrtDevResLimitType枚举值value要设置的资源上限值本样例设置为 8返回值ACL_SUCCESS表示成功其他值为失败。查询资源限制aclrtGetDeviceResLimit接口声明见 acl_rt.h/** * brief Get the value of the current devices limited resources * param [in] deviceId the device id * param [in] type resources type * param [out] value resources limit value * retval ACL_SUCCESS The function is successfully executed. * retval OtherValues Failure */ ACL_FUNC_VISIBILITY aclError aclrtGetDeviceResLimit(int32_t deviceId, aclrtDevResLimitType type, uint32_t* value);其中value为出参用于接收当前进程在该 Device 上对应资源的限制值。同族相关接口在 acl_rt.h 中还声明了同一资源限额体系下的其他接口便于读者按需扩展aclrtResetDeviceResLimit(deviceId)重置当前 Device 的资源限制aclrtGetStreamResLimit(stream, type, value)/aclrtSetStreamResLimit(stream, type, value)以 Stream 为粒度设置/获取资源限制aclrtUseStreamResInCurrentThread(stream)/aclrtUnuseStreamResInCurrentThread(stream)在当前线程启用/停用某 Stream 的资源配额aclrtGetResInCurrentThread(type, value)查询当前线程可用的资源限制值。主程序逐段精读资源限制 Kernel 下发完整源码见 main.cpp。整体结构清晰主流程放在一个立即执行的 lambda 中若中途出错则提前返回随后按创建顺序逆序做资源清理。资源限制查询与 Kernel 下发函数int32_t LaunchPrintKernelWithCurrentResLimit(int32_t deviceId, aclrtDevResLimitType type, aclrtStream stream) { // Query the resource limit and use it as the print kernel block dimension. uint32_t coreDim 0; CHECK_ERROR(aclrtGetDeviceResLimit(deviceId, type, coreDim)); INFO_LOG(Current device resource limit type %d is %u., static_castint32_t(type), coreDim); PrintDo(coreDim, stream); CHECK_ERROR(aclrtSynchronizeStream(stream)); return 0; }这里体现了一个关键设计用查询到的限制值直接作为 Kernel 的 blockDim。也就是说下发的 Kernel 展开的 block 数量严格等于进程被允许使用的核心数从运行结果可以反推资源限制是否真实生效。打印 Kernel 的实现打印 Kernel 定义在 kernel_print.cppextern C __global__ __aicore__ void KernelPrint() { AscendC::printf(Hello World\n); } void PrintDo(uint32_t blockDim, void* stream) { KernelPrintblockDim, nullptr, stream(); }其声明位于 kernel_ops.h。PrintDo将blockDim个 block 下发给指定 Stream每个 block 执行一次AscendC::printf从而输出 blockDim 条Hello World。main 主流程const int32_t deviceId 0; const aclrtDevResLimitType resLimitType ACL_RT_DEV_RES_CUBE_CORE; const uint32_t blockDim 8;在 Device 0 上执行资源类型为 Cube Core资源上限设置为 8。主流程依次执行初始化aclInit(nullptr)初始化 ACL 配置Device 管理aclrtSetDevice(deviceId)指定用于运算的 DeviceStream 管理aclrtCreateStream(stream)创建 Stream设置资源限制aclrtSetDeviceResLimit(deviceId, resLimitType, blockDim)将当前进程的 Cube Core 限制设为 8查询并下发调用LaunchPrintKernelWithCurrentResLimit查询限制值并据此下发 Kernel同步aclrtSynchronizeStream(stream)阻塞等待 Stream 上任务执行完成确保打印输出全部落盘后再继续。逆序清理与错误处理主流程结束后按“后创建、先释放”的顺序做清理任何一步失败都会将最终结果置为失败aclrtDestroyStreamForce(stream)强制销毁StreamaclrtResetDeviceForce(deviceId)强制复位当前运算 Device回收 Device 上的资源aclFinalize()去初始化。UpdateFinalResultOnError封装了对每个清理接口返回码的检查任一接口返回非ACL_SUCCESS即打印错误日志Operation failed: %s returned error code %d并将finalResult置为 -1。示例输出与校验逻辑正常运行时的输出如下来自 README_en.md[INFO]: Current compile soc version is ... Configuring CMake... Building... [INFO] ACL initialized. [INFO] Device 0 selected. [INFO] Stream created. [INFO] Device resource limit type 0 set to 8. [INFO] Current device resource limit type 0 is 8. Hello World Hello World Hello World Hello World Hello World Hello World Hello World Hello World [INFO] Run the launch_kernel_with_reslimit sample successfully. [SUCCESS]: Launch kernels under resource limits successfully.日志解读[INFO] Device resource limit type 0 set to 8.类型 0 即ACL_RT_DEV_RES_CUBE_CORE设置成功[INFO] Current device resource limit type 0 is 8.查询结果与设置值一致读写闭环成立8 条Hello World说明 Kernel 实际以 8 个 block 展开执行资源限制被 Kernel 下发路径真正采纳末尾的[SUCCESS]来自 run.sh 的自动化校验grep -c Hello World统计结果为 8 时判定成功否则输出[FAILURE]: Expected 8 occurrences of ...并以失败退出。总结launch_kernel_with_reslimit样例以最小的代码量串联起了 CANN Runtime 资源限额能力的完整链路通过aclrtSetDeviceResLimit设置进程级 Cube Core 上限通过aclrtGetDeviceResLimit回读验证再以限制值驱动 Kernel 下发最后由脚本对输出做确定性断言。这套“设置 → 查询 → 使用 → 校验”的模式可直接迁移到多任务共享 Device 的资源隔离场景也可结合 acl_rt.h 中同族的 Stream 级与线程级资源限制接口构造更细粒度的资源管控方案。【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/9/18 1:21:13

VS Code配置STM32开发环境:ARM GCC+Cortex-Debug全链路指南

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

2026/9/18 1:21:13

ADB安卓调试工具详解:安装配置、常用命令与避坑指南

1. ADB到底是个啥,以及装好它的正确姿势1.1 先搞明白:ADB不是“一键刷机”那种黑科技很多刚接触安卓开发或者喜欢折腾手机的朋友,第一次听到“ADB”都会觉得这玩意儿挺神秘。其实说白了,ADB(Android Debug Bridge&…

2026/9/18 7:46:27

Folia Electron架构剖析:主进程、预加载与渲染器分工指南

Folia Electron架构剖析:主进程、预加载与渲染器分工指南 【免费下载链接】folia-major 专注于绚丽的歌词动画效果的本地音乐/navidrome/第三方多平台在线音乐播放器 项目地址: https://gitcode.com/GitHub_Trending/fo/folia-major Folia(folia-…

2026/9/18 7:46:27

AI教材编写中的查重问题与降重技巧

1. 为什么我们需要关注AI教材编写的查重问题去年我在帮某教育机构编写Python入门教材时,遇到了一个尴尬的情况:用AI生成的三个章节内容在查重系统中被标记为27%的相似度。这个数字看起来不高,但其中有整整12%的相似内容集中在对"for循环…

2026/9/18 7:46:27

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

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

2026/9/18 7:41:27

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/9/16 12:52:37

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/18 0:01:09

Google Colab 实战:运行模型、数据加载与报错排查

1. 为什么我劝你先搞懂 Colab 的运行模型1.1 Colab 到底是什么,跟本地跑代码差在哪Google Colab 简单说就是一台跑在浏览器里的 Linux 虚拟机,你打开一个 Notebook,背后就连上了一台带 GPU 的远程机器。你在单元格里敲的每一行 Python&#x…

2026/9/18 0:01:09

C语言数据类型与表达式详解

1. C语言数据与数据类型概述在C语言编程中,数据是程序处理的核心对象。理解数据的分类和特性是掌握C语言的基础。C语言中的数据主要分为四大类:常量、变量、表达式和函数。这些数据类型构成了C语言程序的基本元素,每种类型都有其独特的特性和…

2026/9/18 0:01:09

SQL时间字段指定时间段查询:区间语义、索引与时区避坑

上周排查一个线上问题&#xff0c;用户反馈"昨天的订单一条都没查到"&#xff0c;但数据库里明明躺着两千多条。最后定位下来&#xff0c;不是数据丢了&#xff0c;也不是接口挂了&#xff0c;而是那个查询条件把时间段写成了> 2024-05-20 00:00:00 AND < 2024…

2026/9/16 22:55:57

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行&#xff0c;Type-C接口算是典型的“看着简单&#xff0c;做起来全坑”的东西。光引脚就24个&#xff0c;高低速信号、电源、控制线全部塞在一个小小的连接器里&#xff0c;如果PCB布局不做规划&#xff0c;打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/16 22:56:09

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/16 22:56:16

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

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

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

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