news 2026/5/9 17:40:26

CANN/runtime系统任务

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CANN/runtime系统任务

系统任务

【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime

除了可以下发Kernel执行任务外,Runtime还提供下发Reduce和随机数生成的内置系统任务的功能。(系统任务区别于Kernel任务在于无需用户提供执行代码)。 系统任务可以下发到某条Stream异步执行,同样遵循同一流上任务保序执行的规则。

通过aclrtReduceAsync接口可以下发执行Reduce操作任务,调用代码示例如下:

aclInit(NULL); aclrtSetDevice(0); aclrtStream stream; aclrtCreateStream(&stream); // 准备 Host 数据 const int count = 4; float hostInput[4] = {1.0, 2.0, 3.0, 4.0}; float hostOutput[4] = {0, 0, 0, 0}; size_t size = count * sizeof(float); // 申请 Device 内存 void *devInput = NULL; void *devOutput = NULL; aclrtMalloc(&devInput, size, ACL_MEM_MALLOC_HUGE_FIRST); aclrtMalloc(&devOutput, size, ACL_MEM_MALLOC_HUGE_FIRST); // 拷贝数据到 Device aclrtMemcpy(devInput, size, hostInput, size, ACL_MEMCPY_HOST_TO_DEVICE); aclrtMemcpy(devOutput, size, hostInput, size, ACL_MEMCPY_HOST_TO_DEVICE); // 调用 aclrtReduceAsync aclrtReduceAsync(devOutput, devInput, size, ACL_RT_MEMCPY_SDMA_AUTOMATIC_SUM, // 归约类型 ACL_FLOAT, // 数据类型 stream, NULL); // 同步 stream aclrtSynchronizeStream(stream); // 拷回结果 aclrtMemcpy(hostOutput, size, devOutput, size, ACL_MEMCPY_DEVICE_TO_HOST); for (int i = 0; i < count; i++) { printf("Reduce SUM result[%d] = %f\n", i, hostOutput[i]); } /* 预期如下结果 Reduce SUM result[0] = 2.000000 Reduce SUM result[1] = 4.000000 Reduce SUM result[2] = 6.000000 Reduce SUM result[3] = 8.000000 */ // 释放资源 aclrtFree(devInput); aclrtFree(devOutput); aclrtDestroyStream(stream); aclrtResetDeviceForce(0); aclFinalize();

通过aclrtRandomNumAsync执行随机数生成任务,调用代码示例如下:

aclError NormalFloatAsync( float mean, float stddev, uint64_t seed, uint64_t num, void *counterDevAddr, void *devOutput, aclrtStream stream) { aclrtRandomNumTaskInfo taskInfo = {}; taskInfo.dataType = ACL_FLOAT; taskInfo.randomNumFuncParaInfo.funcType = ACL_RT_RANDOM_NUM_FUNC_TYPE_NORMAL_DIS; taskInfo.randomParaAddr = NULL; taskInfo.randomCounterAddr = counterDevAddr; taskInfo.randomResultAddr = devOutput; memcpy(taskInfo.randomNumFuncParaInfo.paramInfo.normalDisInfo.mean.valueOrAddr, &mean, sizeof(float)); taskInfo.randomNumFuncParaInfo.paramInfo.normalDisInfo.mean.size = sizeof(float); taskInfo.randomNumFuncParaInfo.paramInfo.normalDisInfo.mean.isAddr = 0; memcpy(taskInfo.randomNumFuncParaInfo.paramInfo.normalDisInfo.stddev.valueOrAddr, &stddev, sizeof(float)); taskInfo.randomNumFuncParaInfo.paramInfo.normalDisInfo.stddev.size = sizeof(float); taskInfo.randomNumFuncParaInfo.paramInfo.normalDisInfo.stddev.isAddr = 0; memcpy(taskInfo.randomSeed.valueOrAddr, &seed, sizeof(uint64_t)); taskInfo.randomSeed.size = sizeof(uint64_t); taskInfo.randomSeed.isAddr = 0; memcpy(taskInfo.randomNum.valueOrAddr, &num, sizeof(uint64_t)); taskInfo.randomNum.size = sizeof(uint64_t); taskInfo.randomNum.isAddr = 0; return aclrtRandomNumAsync(&taskInfo, stream, NULL); } int main() { aclError ret; // 初始化 ACL ret = aclInit(NULL); ret = aclrtSetDevice(0); aclrtStream stream; ret = aclrtCreateStream(&stream); uint64_t num = 128; size_t size = num * sizeof(uint64_t); // 申请足够大内存 // 申请 Device 内存 void *devOutput = NULL; ret = aclrtMalloc(&devOutput, size, ACL_MEM_MALLOC_NORMAL_ONLY); // 准备 Host 数据 void *hostOutput = malloc(size); // 申请存放随机数状态 counter 的device内存 (要求 16Byte) void *counterAddr = NULL; ret = aclrtMalloc((void **)&counterAddr, 16, ACL_MEM_MALLOC_NORMAL_ONLY); float mean = 3.0; float stddev = 2.0; ret =NormalFloatAsync(mean, stddev, 0, num, counterAddr, devOutput, stream); // 同步 stream aclrtSynchronizeStream(stream); // 拷回结果 aclrtMemcpy(hostOutput, size, devOutput, size, ACL_MEMCPY_DEVICE_TO_HOST); // 释放资源 free(hostOutput); aclrtFree(devOutput); aclrtFree(counterAddr); aclrtDestroyStream(stream); aclrtResetDeviceForce(0); aclFinalize(); return 0; }

【免费下载链接】runtime本项目提供CANN运行时组件和维测功能组件。项目地址: https://gitcode.com/cann/runtime

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/9 17:39:09

【云藏山鹰代数信息系统】浅析意气实体过程知识图谱17

【云藏山鹰代数信息系统】浅析意气实体过程知识图谱17 核心启示&#xff1a;把二十四史看作一个"活的系统""正史"的价值不在要素&#xff0c;而在结构存量-流量模型&#xff1a;理解王朝兴衰的新工具八大陷阱&#xff1a;解读历史反复的"密码"杠…

作者头像 李华
网站建设 2026/5/9 17:38:16

从GCN到时空Transformer:深度学习交通预测技术演进与工程实践

1. 项目概述&#xff1a;当深度学习遇见城市脉搏干了这么多年数据科学和算法工程&#xff0c;我越来越觉得&#xff0c;交通预测这事儿&#xff0c;特别有意思。它不像图像识别或者自然语言处理&#xff0c;有个相对清晰的边界。交通&#xff0c;尤其是城市路网交通&#xff0c…

作者头像 李华
网站建设 2026/5/9 17:33:09

AI时代知识工作者转型:从内容生产到批判性整合的实践指南

1. 项目概述&#xff1a;当知识工作遇上AI&#xff0c;我们到底在忙什么&#xff1f;最近和不少同行聊天&#xff0c;大家都有个共同的感受&#xff1a;自从ChatGPT、Midjourney这类生成式AI工具普及后&#xff0c;我们的工作流程好像被彻底打散了。以前写一份行业报告&#xf…

作者头像 李华
网站建设 2026/5/9 17:33:00

ARM MPC与PPC控制器架构及AXI5协议解析

1. ARM MPC与PPC控制器架构解析在ARM架构的SoC设计中&#xff0c;内存保护控制器(MPC)和外围保护控制器(PPC)是实现硬件级安全隔离的关键组件。这两个控制器通过AXI5总线协议与系统其他部分通信&#xff0c;构建起完整的安全防护体系。1.1 MPC核心功能与接口MPC作为内存保护的核…

作者头像 李华