华为ascend c 示例代码和详细讲解,昇腾 CANN 算子双版本模板代码
华为ascend c 示例代码和详细讲解昇腾 CANN 算子双版本模板代码下面给逐行详细注释 整体逻辑讲解基于昇腾CANN 双分支CCE仿真测试 / ACL 设备运行场景同时补充昇腾相关概念。ai生成// // 宏分支区分编译环境CCE内核仿真测试 / 标准ACL应用// // 如果定义了 CCE_KT_TEST走CCE内核态本地仿真CPU模拟aicore运行单元测试用#ifdefCCE_KT_TEST// 引入TIK/CCE仿真库头文件提供内存分配、内核调用等仿真接口#includetikicpulib.h// 定义aicore为空宏适配aicore内核函数修饰符语法#defineaicore// 未定义 CCE_KT_TEST走正式ACL应用层运行在真实昇腾AI芯片上#else// 引入昇腾ACL基础接口头文件设备、流、内存、上下文管理#includeacl/acl.h// 同样定义aicore空宏统一两端代码语法#defineaicore#endif// // AICORE 内核函数声明算子/核函数入口// // extern C禁用C名字修饰保证C/CCE框架能正常调用该函数// aicore_voidaicore内核侧空返回值类型由上面空宏兼容// HelloWorld自定义aicore核函数名// uint8_t* foo核函数入参指向设备全局内存(Gm)数据externCaicore_voidHelloWorld(uint8_t*foo);// 主函数入口标准程序入口int32_tmain(int32_targc,char*argv[]){// 定义内存大小申请 256 字节的全局内存空间size_tfooSize256;// 定义执行块维度一次启动 8 个aicore执行单元并行计算uint32_tblockDim8;// // 分支1CCE_KT_TEST 内核仿真模式本地CPU调试// #ifdefCCE_KT_TEST// 调用CCE仿真库接口分配芯片全局内存(Gm)返回内存指针// Ascendl::GmAlloc仿真环境下的全局内存分配接口uint8_t*foo(uint8_t*)Ascendl::GmAlloc(fooSize);// ICPU_RUN_KFCCE仿真框架调用aicore内核函数的宏// 参数1核函数名 HelloWorld// 参数2并行执行单元数 blockDim// 参数3传给核函数的内存指针 fooICPU_RUN_KF(HelloWorld,blockDim,foo);// 释放之前分配的全局内存避免内存泄漏Ascendl::GmFree((void*)foo);// // 分支2标准ACL模式真实昇腾硬件运行业务正式环境// #else// 1. 初始化ACL框架整个程序生命周期只调用一次// nullptr使用默认初始化参数aclInit(nullptr);// 定义ACL上下文句柄上下文用于管理设备、流、任务等资源aclrtContext context;// 指定使用的昇腾设备ID此处使用第0号设备int32_tdeviceId0;// 绑定当前线程到指定昇腾设备aclrtSetDevice(deviceId);// 基于设备ID创建运行上下文aclrtCreateContext(context,deviceId);// 定义流句柄Stream 用于异步调度AI任务、控制任务执行顺序aclrtStream streamnullptr;// 创建一个空的计算流aclrtCreateStream(stream);// 定义设备侧内存指针初始置空uint8_t*fooDevicenullptr;// 在昇腾设备上分配显存/全局内存// fooDevice接收内存指针// fooSize内存大小// ACL_MEM_MALLOC_HUGE_FIRST优先使用大页内存提升访存性能aclrtMalloc((void**)fooDevice,fooSize,ACL_MEM_MALLOC_HUGE_FIRST);// 昇腾核函数调用语法 块数, 共享内存大小, 流// blockDim并行执行单元数// nullptr不使用共享内存// stream任务挂载到指定流上异步执行// 后面括号核函数入参设备内存指针HelloWorldblockDim,nullptr,stream(fooDevice);// 流同步阻塞当前线程等待流上所有任务执行完毕// 保证核函数跑完再执行后续逻辑aclrtSynchronizeStream(stream);// 逆序释放资源创建顺序内存→流→上下文→设备→ACL释放反过来// 释放设备侧内存aclrtFree(fooDevice);// 销毁计算流aclrtDestroyStream(stream);// 销毁运行上下文aclrtDestroyContext(context);// 解除当前线程与设备的绑定aclrtResetDevice(deviceId);// 最终销毁ACL框架程序退出前最后一步aclFinalize();#endif// 程序正常退出返回0return0;}一、整体架构总览这是昇腾CANN 算子双版本模板代码一套代码兼容两种运行模式CCE_KT_TEST 模式用途本地仿真调试、单元测试运行环境PC/服务器 CPU模拟 AICORE 内核执行依赖tikicpulib.hCCE 仿真库特点无需真实昇腾芯片适合算子开发、代码排错默认 ACL 模式用途线上业务、正式部署运行环境真实昇腾AI芯片310P/310B/910 等依赖标准 ACL 运行时库特点走硬件加速流程完整的「上下文-流-内存-任务调度」二、关键名词通俗解释aicore昇腾芯片的AI计算核心负责执行算子、矩阵运算、并行计算代码中用空宏#define aicore做语法兼容。Gm 全局内存昇腾芯片上的设备全局显存所有aicore核心都能访问代码中GmAlloc/aclrtMalloc都是分配这块内存。blockDim并行粒度blockDim 8代表同时启动8个aicore单元并行跑同一个核函数。ACL 上下文(context)资源容器管理设备、流、内存、任务队列一个程序可创建多个上下文。Stream 流异步任务队列算子任务挂载到流上排队执行支持多任务并行/串行aclrtSynchronizeStream等待流内任务全部结束。语法昇腾对标 CUDA 的核函数启动语法格式核函数块数, 共享内存, 流(入参)三、ACL 标准执行流程固定顺序不能乱ACL 模式是昇腾应用开发标准流程创建 释放必须逆序aclInit初始化框架aclrtSetDevice绑定设备aclrtCreateContext创建上下文aclrtCreateStream创建流aclrtMalloc分配设备内存启动核函数HelloWorldaclrtSynchronizeStream等待任务完成逆序释放内存 → 流 → 上下文 → 设备 →aclFinalize四、两大分支使用场景区分开发调试阶段加编译宏-DCCE_KT_TEST用CCE仿真不用插昇腾卡快速调试内核逻辑。上线部署阶段不加宏走ACL硬件模式跑在真实昇腾卡上发挥硬件加速能力。ai生成