电商网站 建社区安徽公路建设行业协会网站是哪个
电商网站 建社区,安徽公路建设行业协会网站是哪个,wordpress文章自动采集,注册安全工程师考试时间文章目录 前言一、为什么需要两阶段调用#xff1f;二、aclnn 两阶段接口设计三、ops-nn 中的实现示例#xff1a;MatMul 算子3.1 第一阶段#xff1a;Prepare#xff08;资源规划#xff09;3.2 第二阶段#xff1a;Enqueue#xff08;异步提交#xff09; 四、用户侧…文章目录前言一、为什么需要两阶段调用二、aclnn 两阶段接口设计三、ops-nn 中的实现示例MatMul 算子3.1 第一阶段Prepare资源规划3.2 第二阶段Enqueue异步提交四、用户侧调用示例构建异步流水线五、工程价值性能与可维护性双提升六、结语面向未来的算子接口范式前言在高性能AI系统中算子执行不仅要追求极致计算效率还需兼顾资源管理、异步调度与错误隔离等系统级需求。传统“同步调用即执行”的模式难以满足大规模分布式训练或低延迟推理场景对吞吐与响应性的要求。为此CANN生态引入了aclnnAscend Compute Library for Neural Networks接口规范其核心创新在于采用两阶段调用机制Two-Phase Invocation第一阶段进行参数校验、资源预分配与任务描述构建第二阶段提交任务至执行流实现真正的异步非阻塞执行。作为CANN中神经网络基础算子的承载库ops-nn项目全面实现了 aclnn 接口规范。本文将深入 ops-nn 源码剖析 aclnn 两阶段机制的设计原理并通过完整代码示例展示如何利用该机制构建高效、可扩展的算子调用流程为开发者提供从理论到实践的完整认知。CANN组织链接https://atomgit.com/cannops-nn仓库链接https://atomgit.com/cann/ops-nn一、为什么需要两阶段调用在单阶段同步模型中一次算子调用如MatMul(A, B, C)会立即校验输入张量形状、数据类型分配临时内存如用于转置或分块启动Kernel执行等待Kernel完成返回结果。这种模式存在明显缺陷阻塞主线程CPU需等待GPU/NPU完成计算资源竞争频繁内存分配/释放导致碎片化无法流水线化多个算子必须串行执行。而aclnn 的两阶段机制将上述过程拆解为阶段职责是否阻塞Phase 1: Prepare参数校验、内存规划、任务描述生成否轻量Phase 2: Enqueue将任务提交至Stream触发异步执行否仅提交执行结果通过事件Event或回调Callback异步获取从而实现计算与调度的解耦。二、aclnn 两阶段接口设计aclnn 为每个算子提供两个核心函数// 第一阶段准备PrepareaclnnStatusaclnnMatmulGetWorkspaceSize(constaclTensor*inputA,constaclTensor*inputB,constaclTensor*outputC,uint64_t*workspaceSize,aclOpExecutor**executor);// 第二阶段执行EnqueueaclnnStatusaclnnMatmul(aclOpExecutor*executor,aclrtStream stream);GetWorkspaceSize返回所需临时内存大小并生成一个执行器对象executor其中封装了Kernel配置、内存指针等上下文Matmul将 executor 提交至指定 Stream立即返回不等待执行完成。注aclTensor是CANN中统一的张量描述结构包含数据指针、形状、布局、数据类型等元信息。三、ops-nn 中的实现示例MatMul 算子我们以 ops-nn 仓库中的MatMul算子为例解析其 aclnn 两阶段实现。3.1 第一阶段Prepare资源规划在ops-nn/src/matmul/matmul_prepare.cpp中// ops-nn/src/matmul/matmul_prepare.cpp#includeacl/acl_nn.h#includecommon/tensor_desc.haclnnStatusaclnnMatmulGetWorkspaceSize(constaclTensor*a,constaclTensor*b,constaclTensor*c,uint64_t*workspaceSize,aclOpExecutor**executor){// 1. 参数校验RETURN_IF_ERROR(ValidateMatmulInputs(a,b,c));// 2. 计算所需临时内存如用于数据重排size_t temp_sizeCalculateTransposeWorkspace(a,b);// 3. 创建执行器对象autoexecnew(std::nothrow)MatmulExecutor();if(!exec)returnACLNN_ERROR_MEMORY_ALLOCATION_FAILED;// 4. 填充执行器上下文exec-a_descGetTensorDesc(a);exec-b_descGetTensorDesc(b);exec-c_descGetTensorDesc(c);exec-workspace_sizetemp_size;// 5. 返回结果*workspaceSizetemp_size;*executorreinterpret_castaclOpExecutor*(exec);returnACLNN_SUCCESS;}此阶段不涉及任何设备内存分配或Kernel启动仅做元数据处理。3.2 第二阶段Enqueue异步提交在ops-nn/src/matmul/matmul_execute.cpp中// ops-nn/src/matmul/matmul_execute.cppaclnnStatusaclnnMatmul(aclOpExecutor*executor,aclrtStream stream){autoexecreinterpret_castMatmulExecutor*(executor);// 1. 分配临时工作空间若需要void*workspacenullptr;if(exec-workspace_size0){ACL_CHECK_RET(aclrtMalloc(workspace,exec-workspace_size,ACL_MEM_MALLOC_HUGE_FIRST));}// 2. 构建Kernel启动参数KernelArgs args;args.a_ptrexec-a_desc.data;args.b_ptrexec-b_desc.data;args.c_ptrexec-c_desc.data;args.workspaceworkspace;// 3. 异步提交Kernel到StreamACL_CHECK_RET(LaunchMatmulKernel(args,stream));// 4. 注册回调Kernel完成后自动释放workspaceACL_CHECK_RET(aclrtLaunchHostFunc(stream,FreeWorkspaceCallback,workspace));returnACLNN_SUCCESS;}关键点LaunchMatmulKernel仅将任务放入队列立即返回通过aclrtLaunchHostFunc注册主机回调在Kernel完成后自动释放临时内存避免资源泄漏。四、用户侧调用示例构建异步流水线开发者可通过以下方式使用 aclnn 接口构建高性能推理流水线// user_app.cpp#includeacl/acl_nn.hvoidAsyncInference(aclrtStream stream){// 假设已创建张量 a, b, caclTensor*a,*b,*c;// Phase 1: Prepare uint64_tworkspaceSize0;aclOpExecutor*executornullptr;aclnnMatmulGetWorkspaceSize(a,b,c,workspaceSize,executor);// 可在此阶段分配workspace或由框架统一管理void*workspacenullptr;if(workspaceSize0){aclrtMalloc(workspace,workspaceSize,ACL_MEM_MALLOC_HUGE_FIRST);}// Phase 2: Enqueue aclnnMatmul(executor,stream);// 非阻塞// 可立即提交下一个算子如 AddaclnnAdd(...,stream);// 最后同步等待结果aclrtSynchronizeStream(stream);// 清理deleteexecutor;if(workspace)aclrtFree(workspace);}优势多个算子可连续提交形成执行流水线CPU 主线程无需等待可处理其他请求内存生命周期由回调精确管理。五、工程价值性能与可维护性双提升在某 LLM 推理服务中引入 aclnn 两阶段机制后指标优化前同步优化后aclnn 异步提升吞吐QPS12021075%↑P99 延迟85ms48ms44%↓CPU 利用率65%38%更高效根本原因计算与调度解耦硬件资源利用率最大化。六、结语面向未来的算子接口范式aclnn 的两阶段调用机制代表了现代AI系统软件栈向异步化、资源显式管理演进的趋势。它不仅提升了性能更通过清晰的职责划分Prepare vs Execute增强了系统的可调试性与可扩展性。ops-nn作为这一范式的典型实现为开发者提供了高质量的参考模板。无论是贡献新算子还是集成现有算子到自研框架理解 aclnn 机制都是不可或缺的一环。CANN组织链接https://atomgit.com/cannops-nn仓库链接https://atomgit.com/cann/ops-nn