
CANN opbase 的 AI CPU 任务封装与启动接口解析aicpu_task 保留接口的完整使用指南【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase本文围绕 CANN opbase 算子库中op::internal命名空间下的aicpu_task接口族展开系统讲解 AI CPUAI CPU算子从任务封装、参数组装、任务复用缓存到内核启动的完整链路。该接口族被ADD_TO_LAUNCHER_LIST_AICPU等宏和 AI CPU 算子调度框架内部使用阅读本文后你将理解AicpuTask、AicpuTfTask、AicpuCCTask、AicpuTaskSpace的职责划分掌握任务键task key的生成与命中判定逻辑、属性与张量列表的组装方式以及环境变量ACLNN_CACHE_LIMIT、GE_PROFILING_TO_STD_OUT对任务缓存与耗时打点的影响从而具备阅读、排查和扩展 AI CPU 算子执行路径的实战能力。接口定位AI CPU 任务调度链路的保留接口aicpu_task中声明的 API 属于op::internal内部命名空间官方文档明确标注为保留接口reserved interface未来可能被修改或废弃不建议业务代码直接依赖。但从源码看它们正是 CANN opbase 中 AI CPU 算子一次封装、多次复用、按需启动的核心实现aicpu_task.h 中kAicpuKeyBufLen 1024U定义了任务键缓冲区的固定长度kDefaultFunctionName RunCpuKernel是 AI CPU 算子的默认入口函数名任务类的Init/Run虚函数接口aicpu_task.h分别完成参数与二进制装载和地址刷新与内核下发两件事任务容器AicpuTaskSpace以算子类型 输入元信息 属性取值生成哈希键实现同构任务的复用。由于这些接口承担的是框架内部调度职责本文在讲解时会同时给出接口语义与源码实现证据两条线方便你在阅读算子内核代码或调试 AI CPU 执行链路时对号入座。下表完整列出该接口族提供的全部 API继承自原文档共 57 项后续章节将按功能分组深入讲解API 定义功能描述PrintAicpuAllTimeStampInfo(const char *opType)打印 AI CPU 任务执行各阶段系统时间戳AppendTensor(aclOpExecutor *executor, const aclTensor *arg, V l)将aclTensor指针插入容器模板函数AppendTensor(aclOpExecutor *executor, const aclScalar *arg, V l)将aclScalar指针转换后插入容器模板函数AppendTensor(aclOpExecutor *executor, const aclIntArray *arg, V l)将aclIntArray指针转换后插入容器模板函数AppendTensor(aclOpExecutor *executor, const aclTensorList *arg, V l)将aclTensorList中元素逐一插入容器模板函数CreateTensorListImpl(aclOpExecutor *executor, OpArg arg, TensorList l)根据参数类型创建张量列表模板函数CreateTensorList(aclOpExecutor *executor, OpArgList t, TensorList l)创建张量列表Append1Byte(uint8_t *buf, uint8_t src)向指定缓冲区追加一个字节AppendAttrForKey(const V value, uint8_t *key, size_t keyLen)将属性信息追加到任务键字段模板函数AppendAttrForKey(const std::string value, ...)将const string 属性追加到任务键字段AppendAttrForKey(const std::string *value, ...)将const string指针属性追加到任务键字段AppendAttrForKey(std::string *value, ...)将string指针属性追加到任务键字段AppendAttrForKey(const std::vectorV value, ...)将vector属性追加到任务键字段AppendAttrForKey(const aclIntArray *value, ...)将const aclIntArray属性追加到任务键字段AppendAttrForKey(aclIntArray *value, ...)将aclIntArray属性追加到任务键字段AppendAttrForKey(const aclFloatArray *value, ...)将const aclFloatArray属性追加到任务键字段AppendAttrForKey(aclFloatArray *value, ...)将aclFloatArray属性追加到任务键字段AppendAttrForKey(const aclBoolArray *value, ...)将const aclBoolArray属性追加到任务键字段AppendAttrForKey(aclBoolArray *value, ...)将aclBoolArray属性追加到任务键字段AddAicpuAttr(const aclIntArray *value, const std::string attrName, AicpuAttrs attrs)添加 AI CPU 整型数组属性字段AddAicpuAttr(aclIntArray *value, const std::string attrName, AicpuAttrs attrs)添加 AI CPU 整型数组属性字段AddAicpuAttr(const aclFloatArray *value, const std::string attrName, AicpuAttrs attrs)添加 AI CPU 浮点数组属性字段AddAicpuAttr(aclFloatArray *value, const std::string attrName, AicpuAttrs attrs)添加 AI CPU 浮点数组属性字段AddAicpuAttr(const aclBoolArray *value, const std::string attrName, AicpuAttrs attrs)添加 AI CPU 布尔数组属性字段AddAicpuAttr(aclBoolArray *value, const std::string attrName, AicpuAttrs attrs)添加 AI CPU 布尔数组属性字段AddAicpuAttr(const V value, const std::string attrName, AicpuAttrs attrs)向 AI CPU 属性表添加简单数据类型属性GetTid()获取当前工作线程的线程 IDaclnnAicpuFinalize()反初始化 AI CPU 模块CreatAicpuKernelLauncher(uint32_t opType, op::internal::AicpuTaskSpace space, aclOpExecutor *executor, const FVectorstd::string attrNames, op::OpArgContext *args)创建 AI CPU 任务下发对象AicpuTask()构造AicpuTask类的默认实例AicpuTask(const std::string opType, const ge::UnknowShapeOpType unknownType)构造带参的AicpuTask实例AicpuTfTask(const std::string opType, const ge::UnknowShapeOpType unknownType)构造 AI CPU 框架的 TensorFlow 算子任务aclnnStatus Init(const FVectorconst aclTensor * inputs, const FVectoraclTensor* outputs, const AicpuAttrs attrs)初始化算子框架任务aclnnStatus Run(aclOpExecutor *executor, aclrtStream stream)运行算子框架任务AicpuCCTask(const std::string opType, const ge::UnknowShapeOpType unknownType)构造 AI CPU 框架的 CANN 算子任务aclnnStatus SetIoTensors(aclOpExecutor *executor, op::OpArgContext *args)刷新任务的输入输出地址void SetSpace(void *space)设置任务所在的容器void SetVisit(bool visit)设置任务是否被占用AicpuTaskSpace(const std::string opType, const ge::UnknowShapeOpType unknownType ge::DEPEND_IN_SHAPE, const bool isTf false)构造 AI CPU 任务容器AicpuTask *FindTask(aclOpExecutor *executor, op::OpArgContext *args, const FVectorconst aclTensor* inputs)检查任务是否可复用AicpuTask *GetOrCreateTask(aclOpExecutor *executor, const FVectorstd::string attrNames, op::OpArgContext *args)获取新建或复用的任务void SetRef(const size_t index, const bool isInput true)将指定索引设置为引用型输入bool IsRef(const size_t index, const bool isInput true) const检查指定索引是否为引用型输入uint64_t CalcHostInputDataSize(const FVectorconst aclTensor * inputs, size_t alignBytes) const计算 Host 侧输入数据总大小uint64_t CalcDeviceCacheSize(const FVectorconst aclTensor * inputs, std::unique_ptrAicpuTask aicpuTask) const计算 Device 侧预留内存大小void Clear()清空缓存任务static size_t GenHashBinary(const uint8_t *addr, uint32_t len)生成任务哈希键种子size_t GenTaskKey(uint8_t inputKey[], size_t keyLen, op::OpArgContext *args, const FVectorconst aclTensor* inputs) const生成任务检索键任务实体AicpuTask 类族及其职责划分抽象基类 AicpuTaskAicpuTask是 AI CPU 任务的抽象基类管理任务的封装、初始化、下发与执行相关参数与方法。其完整定义见 AicpuTask 类文档 与 aicpu_task.h。文档中的 API 表列出了默认实例构造AicpuTask()而当前仓库源码中实际提供的是带参构造AicpuTask(const std::string opType, const ge::UnknowShapeOpType unknownType) : opType_(opType), unknownType_(unknownType) {}该构造将算子类型opType_与动态 Shape 类型unknownType_绑定为任务的固有属性。基类声明了两个纯虚函数是子类必须实现的契约virtual aclnnStatus Init(const FVectorconst aclTensor* inputs, const FVectoraclTensor* outputs, const AicpuAttrs attrs) 0完成参数缓冲区构建、扩展信息解析与二进制装载virtual aclnnStatus Run(aclOpExecutor* executor, aclrtStream stream) 0在指定 stream 上刷新输入输出地址并下发内核。基类成员中值得关注的是任务键相关字段成员类型默认值说明opType_const std::string任务对应的 AI CPU 算子名unknownType_const ge::UnknowShapeOpType-动态 Shape 类型标记基类约定argsHandle_std::unique_ptrAicpuArgsHandlernull任务封装参数管理器extInfoHandle_std::unique_ptrAicpuExtInfoHandlernull扩展封装参数管理器launchId_uint64_t0性能分析任务 IDsummaryItemId_uint64_t0汇总条目 IDspace_void*null任务所属的容器inputs_ / outputs_FVector...null算子输入/输出张量指针列表inputKey_uint8_t[kAicpuKeyBufLen]0任务键字段固定 1024 字节keyLen_size_t0任务键长度isVisit_boolfalse当前任务是否被占用deviceExtMemSize_ / deviceCacheOffset_uint64_t0Device 侧预留内存大小与偏移其中inputKey_是任务复用的核心依据任务创建时会把线程 ID 输入张量元信息 属性取值序列化到该缓冲区后续相同特征的调用通过比对keyLen_与逐字节内容命中同一任务。两个具体子类AicpuTfTask 与 AicpuCCTaskAicpuTfTask面向TensorFlow 第三方框架算子isTf true时创建AicpuCCTask面向CANN 自研算子。二者在 aicpu_task.cpp 中的实现差异体现在参数格式与二进制来源上维度AicpuTfTaskAicpuCCTask参数处理器AicpuTfArgsHandlerAicpuCCArgsHandler扩展信息GenTfExtBuffer生成 TF 格式扩展缓冲GenCCExtBuffer生成 CC 格式扩展缓冲二进制来源JsonLoadManger::LoadTfBinaryFromJson()加载 TF 二进制默认libcpu_kernels.soaicpu_task.cppPyTorch 类算子走libpt_kernels.so自定义算子走custom_sub_repository.so下发内核类型KERNEL_TYPE_FWK1KERNEL_TYPE_AICPU2AicpuCCTask::GetKernelNameAndSoNameaicpu_task.cpp展示了算子内核库的选择逻辑先查询自定义算子注册表FindAndGetInCustomRegistry命中则加载自定义内核库并将functionName_设为注册表中的函数名同时将kernelSoName固定为custom_sub_repository.so以保证与 Device 侧一致未命中则从内置算子信息库加载其中{Index, IndexPut, LeftShift}三个 PyTorch 算子aicpu_task.cpp使用libpt_kernels.so。为了兼容旧版本 opp_kernel 与 runtime 包源码中还维护了两张兼容白名单aicpu_task.cpptfCompatibleOps如 ResizeBilinear、Roll、Mean 等 8 个算子与aicpuCompatibleOps如 Pad、ReduceSum、Sigmoid 等 10 个算子。当算子命中白名单或算子信息库不支持新启动接口时任务会回退到旧流程rtAicpuKernelLaunchExWithArgs否则优先使用新接口aclrtLaunchKernelWithHostArgs见AicpuTfTask::Run/AicpuCCTask::Run。这类兼容细节说明这些保留接口在真实调度中承担了新旧两代 runtime 启动方式的自动适配。任务容器与复用机制AicpuTaskSpaceAicpuTaskSpace管理 AI CPU 任务的复用逻辑包括任务创建与检索。其构造参数决定了任务容器面向的算子类别AicpuTaskSpace(const std::string opType, const ge::UnknowShapeOpType unknownType ge::DEPEND_IN_SHAPE, const bool isTf false)opType算子名unknownType动态 Shape 类型默认ge::DEPEND_IN_SHAPECANN 自研第一类动态 Shape 算子若为ge::DEPEND_SHAPE_RANGE则属于需 Device 侧扩展信息回传输出 Shape 的第三类算子isTf是否第三方框架算子true时创建AicpuTfTaskfalse时创建AicpuCCTask。容器内部使用std::unordered_mapsize_t, std::vectorstd::unique_ptrAicpuTaskaicpu_task.h保存任务哈希键由GenTaskKey生成。GetOrCreateTask查缓存、建任务、写缓存GetOrCreateTaskaicpu_task_base.cpp是任务复用的总入口流程如下用CreateTensorList从args的OP_INPUT_ARG参数构建输入张量列表调用FindTask尝试命中缓存任务未命中则加锁创建新任务按isTf_实例化AicpuTfTask或AicpuCCTask调用SetSpace将容器指针写回任务用CreateAicpuAttrs组装属性表后执行Init通过GenTaskKey生成任务键并拷贝到任务的inputKey_/keyLen_标记isVisit_ true计算 Device 缓存大小并更新executor-workspaceDeviceAicpuMem_若当前缓存任务总数低于上限kAicpuCacheLimit则入缓存hashMap_[seed].emplace_back(...)若缓存已满则把任务交给SavePendingOverflowTask暂存为一次性任务one-shot由AiCpuOneShotKernelLauncher消费。FindTask任务键比对与占用过滤FindTaskaicpu_task_base.cpp先按当前参数生成任务键再到哈希表中查找命中后还要求长度相等、逐字节一致且该任务未被占用!task-isVisit_。命中后同样会累计 Device 缓存大小到executor-workspaceDeviceAicpuMem_并将任务标记为isVisit_ true防止并发复用。任务执行完Run返回后由AiCpuKernelLauncher在Launch或析构时调用SetVisit(false)归还aicpu_kernel_launcher.h。缓存上限ACLNN_CACHE_LIMIT 环境变量任务缓存数量并非无限。ReadAicpuCacheLimitaicpu_task_base.cpp读取环境变量ACLNN_CACHE_LIMIT默认上限10000 个任务最大值钳制10000000 个任务非数字取值会被忽略并回退默认值同时打印告警日志。超过上限后新任务不再入缓存而是作为一次性任务立即下发避免缓存无限增长造成内存膨胀。引用型输入标记SetRef / IsRefSetRef(index, isInput)与IsRef(index, isInput)aicpu_task_base.cpp分别用于登记和查询指定下标是否为引用ref型输入/输出。注意SetRef只在hasInit_ false任务尚未初始化时生效容器一旦完成首次初始化引用索引集合即被冻结。该机制服务于 in-place 类算子如 IndexPut 中self既是输入又是输出的场景的地址管理。内存预算CalcHostInputDataSize 与 CalcDeviceCacheSizeCalcHostInputDataSizeaicpu_task_base.cpp遍历输入张量仅统计TensorPlacement::kOnHost的输入按CalcShapeBytes计算数据字节数并以alignBytes对齐后累加CalcDeviceCacheSizeaicpu_task_base.cpp在DEPEND_SHAPE_RANGE场景下加上deviceExtMemSize_并将 Host 输入缓存大小超过 1024 字节的部分计入 Device 预留内存。最终值汇总到executor-workspaceDeviceAicpuMem_作为工作空间内存申请的依据。任务键生成Append1Byte、AppendAttrForKey 与 GenTaskKey任务复用的核心是把输入元信息 属性取值序列化成可哈希的字节流。GenTaskKeyaicpu_task_base.cpp按如下顺序拼装线程 IDGetTid()每个输入张量的GetDataType()与GetViewFormat()各占一个字节分隔符/0x2F全部属性参数OP_ATTR_ARG经GenKeyByAttrs序列化的字节流最终由GenHashBinary计算哈希种子作为容器哈希表键。字节级基础工具Append1Byte(uint8_t *buf, uint8_t src)aicpu_task.h写入一个字节并返回buf 1是键拼接的最基本操作模板版AppendAttrForKey(const V value, ...)按sizeof(value)逐字节追加任意简单类型std::string及其指针版本逐字符追加std::vectorV版本逐元素递归追加aclIntArray/aclFloatArray/aclBoolArray含 const 与非 const 版本则通过GetData()[i]逐元素追加。所有追加都受kAicpuKeyBufLen 1024上限约束达到上限即停止防止缓冲区溢出。哈希种子算法GenHashBinaryaicpu_task_base.cpp以 8 字节为单位读取键数据使用std::hashuint64_t结合常量种子kHashSeed 0x9e3779b9U做混合seed ^ hasher(*ptr) kHashSeed (seed 6U) (seed 2U);尾部不足 8 字节的剩余数据会先拼接进一个uint64_t后参与最后一次混合。注意哈希键是概率性的FindTask中命中哈希桶后还会做keyLen_与逐字节的精确比对保证不会因哈希冲突误复用任务。属性序列化GenKeyByAttrs 与 CreateAicpuAttrsGenKeyByAttrsImplaicpu_task_base.cpp按OpArg的类型标签OPARG_INT_LIST、OPARG_FLOAT_LIST、OPARG_BOOL、OPARG_INT、OPARG_UINT、OPARG_FLOAT、OPARG_DOUBLE、OPARG_DATATYPE、OPARG_STRING等分派到对应的AppendAttrForKey重载用于任务键的生成CreateAicpuAttrsImplaicpu_task_base.cpp按同样类型分派到AddAicpuAttr用于构造内核可见的属性表AicpuAttrs二者共用一套 OpArg 类型体系保证键生成与参数生成口径一致。张量列表与属性组装AppendTensor、CreateTensorList 与 AddAicpuAttrAI CPU 算子入参既有aclTensor也有aclScalar、aclIntArray、aclTensorList等非张量形态。AppendTensor的四个重载aicpu_task.h统一将它们归一化为张量入参形态转换行为const aclTensor*直接emplace_back原指针const aclScalar*调用executor-ConvertToTensor(arg, dataType)数据类型缺省为ge::DT_INT64const aclIntArray*调用executor-ConvertToTensor(arg, ge::DT_INT64)转为整型张量const aclTensorList*遍历arg-Size()个元素逐一插入CreateTensorListImplaicpu_task.h根据OpArg::typeOPARG_ACLTENSOR/OPARG_ACLSCALAR/OPARG_INT_LIST/OPARG_ACLTENSOR_LIST自动分派到上述重载CreateTensorList则对整个OpArgList执行遍历。这套工具被GetOrCreateTask、SetIoTensors广泛使用是实现输入参数统一化为张量列表的关键。属性侧AddAicpuAttr的七个重载aicpu_task.h将各类属性值封装为AnyValue存入AicpuAttrsaclIntArray/aclIntArray*→std::vectorint64_taclFloatArray/aclFloatArray*→std::vectorfloataclBoolArray/aclBoolArray*→std::vectorbool模板版本const V→ 直接AnyValue::CreateFrom(value)覆盖标量、字符串等简单类型。线程 IDGetTidGetTidaicpu_task.h使用thread_local static缓存syscall(__NR_gettid)的结果首次调用后不再触发系统调用性能开销可忽略。线程 ID 被拼入任务键确保不同线程上的任务不会相互复用因为GetOrCreateTask的查找与创建存在线程间竞争键中含线程 ID 可隔离不同线程的任务空间。启动入口CreatAicpuKernelLauncher 与 ADD_TO_LAUNCHER_LIST_AICPUCreatAicpuKernelLauncher任务 → 启动器 → 执行队列CreatAicpuKernelLauncheraicpu_task.cpp是任务下发对象的创建入口校验args非空调space.GetOrCreateTask(...)获取新建或复用任务检查是否有待处理的溢出任务TakePendingOverflowTask有则创建一次性启动器AiCpuOneShotKernelLauncher并executor-AbandonCache(true)丢弃缓存无则创建可缓存启动器AiCpuKernelLauncher并executor-AbandonCache()将启动器加入执行队列executor-AddToKernelLauncherList(launcher)调用BuildGraph记录算子图拓扑输入、输出、工作空间。其中AiCpuKernelLauncheraicpu_kernel_launcher.h的Launch()依次执行task-SetIoTensors(...)与task-Run(...)executor-IsRepeatable()为假时Run返回后立即SetVisit(false)归还任务否则在析构时归还以支持执行器的缓存复用语义。ADD_TO_LAUNCHER_LIST_AICPU 宏面向算子开发者暴露的统一入口是宏ADD_TO_LAUNCHER_LIST_AICPUaicpu_task.hADD_TO_LAUNCHER_LIST_AICPU(KERNEL_NAME, attrNames, opArgs...)宏内部通过GetOpArgContext(opArgs)收集算子入参再调用CreatAicpuKernelLauncher(KERNEL_NAME##OpTypeId(), space, executor, attrNames, opArgCtx)。根据宏使用文档其典型用法如下// 为 IndexPut 算子创建执行任务accumulate 为属性名及属性参数 // selfRef、values、masks、indices 为输入out 为输出 ADD_TO_LAUNCHER_LIST_AICPU(IndexPut, OP_ATTR_NAMES({accumulate}), OP_INPUT(selfRef, values, masks, indices), OP_OUTPUT(out), OP_ATTR(accumulate));使用注意事项若算子需要INFER_SHAPE必须先调用 INFER_SHAPE 宏 完成形状推导宏展开后会调用 OP_ATTR_NAMES、OP_INPUT(x...)、OP_OUTPUT(x...)、OP_ATTR(x...)等配套宏任务真正执行发生在第二阶段 APIaclnn_Xxx_被调用时即创建任务入队与执行解耦。op::internal::AiCpuKernelLauncher还会通过LauncherRepeatableCheckerCheckRepeatable判断同一执行器是否可在多组输入间复用这也是SetVisit/IsRepeatable配合实现任务级复用的完整闭环。任务生命周期Init、Run 与 SetIoTensorsInit装载与建参AicpuTfTask::Initaicpu_task.cpp与AicpuCCTask::Initaicpu_task.cpp都执行以下关键步骤计算性能分析 IDMsprofGetHashId与汇总条目 IDGenSummaryItemId创建AicpuExtInfoHandler并生成扩展信息缓冲TF 或 CC 格式DEPEND_SHAPE_RANGE场景下记录deviceExtMemSize_创建对应参数处理器AicpuTfArgsHandler/AicpuCCArgsHandler生成并构建任务参数GenTfArgs/GenCCArgsBuildTfArgs/BuildCCArgs其中 CC 版本会带上内核函数名与内核库名将扩展信息解析到 Host 参数缓冲extInfoHandle_-Parse从 JSON 算子信息库装载二进制句柄并根据白名单与IsSupportedNewLaunch()决定使用新/旧启动接口。Run地址刷新与内核下发AicpuCCTask::Runaicpu_task.cpp的时序可作为典型代表argsHandle_-UpdateDeviceExtInfoAddr(extInfoHandle_-deviceExtInfo_)同步 Device 侧扩展信息地址若本次 stream 与上次不同调用extInfoHandle_-UpdateKernelId()刷新内核 IDargsHandle_-UpdateIoAddr(...)刷新输入输出地址在OpDfxGuard保护下执行内核下发新接口走aclrtLaunchKernelWithHostArgs自定义算子先aclrtRegisterCpuFunc注册函数句柄旧接口走rtAicpuKernelLaunchExWithArgs对DEPEND_SHAPE_RANGE算子调用extInfoHandle_-UpdateOutputShapeFromExtInfo(outputs_, stream)把 Device 侧计算出的输出 Shape 回拷到 Host在开启性能开关时上报附加信息ReportAdditionInfo任务类型MSPROF_GE_TASK_TYPE_AI_CPU最后调用PrintAicpuAllTimeStampInfo(opType)输出各阶段耗时若已启用打点。SetIoTensors执行前的输入输出刷新AicpuTask::SetIoTensorsaicpu_task_base.cpp清空并重建任务的inputs_/outputs_列表然后调用extInfoHandle_-UpdateInputAndOutputShape(...)更新输入输出 Shape 与地址。由于 AI CPU 任务会被多次复用每次真正下发前都必须用本次调用的实际张量刷新任务内部状态这正是SetIoTensors在AiCpuKernelLauncher::Launch中被首先调用的原因。资源管理与清理aclnnAicpuFinalize 与 ClearaclnnAicpuFinalizeaicpu_task_base.cpp负责 AI CPU 模块的反初始化在全局锁gAicpuTaskSpaceMutex_保护下遍历全局容器集合gAicpuTaskSpaceSet对每个容器调用space-Clear()即hashMap_.clear()释放全部缓存任务然后清空容器集合。源码注释特别强调Clear()内部不加锁以避免 Finalize 与任务 Init 并发调用时容器成员锁与全局锁互相死锁。容器创建后由SaveAicpuTaskSpaceaicpu_task_base.cpp注册到全局集合保证 Finalize 时能遍历到所有已创建容器。因此进程退出前的资源回收依赖开发者或框架收尾逻辑正确调用aclnnAicpuFinalize()。调试与性能分析PrintAicpuAllTimeStampInfo 与环境变量PrintAicpuAllTimeStampInfo(opType)aicpu_task_base.cpp在gAicpuTimeStamp.isEnable为真时按算子执行阶段打印耗时微秒阶段含义FindTask缓存查找耗时UpdateShape输入输出 Shape 更新耗时ShapeH2DShape 从 Host 拷贝到 Device 耗时UpdateArgs参数地址刷新耗时Launch内核下发耗时CopyShapeD2H输出 Shape 从 Device 回拷 Host 耗时UpdateOutputShape输出 Shape 更新耗时打点开关由环境变量GE_PROFILING_TO_STD_OUT1控制EnableAicpuTimeStampaicpu_task_base.cpp输出样例形如test case opType: IndexPut, index: 0 FindTask : 0.015000 ...这套打点机制配合RecordAicpuTime插桩点可用于定位 AI CPU 算子执行链路中各环节的性能瓶颈是调优分布式/高并发 AI CPU 算子时的实用工具。总结与使用建议aicpu_task接口族是 CANN opbase 中 AI CPU 算子调度链路的内部引擎AicpuTaskSpace负责按算子类型 输入元信息 属性值复用任务AicpuTask含AicpuTfTask/AicpuCCTask负责参数封装与内核下发AppendTensor/AppendAttrForKey/AddAicpuAttr等工具函数统一了张量列表与属性的序列化口径CreatAicpuKernelLauncher与ADD_TO_LAUNCHER_LIST_AICPU则把任务接入aclOpExecutor的执行队列配合SetIoTensors/SetVisit/SetRef实现入队即封装、执行即刷新的复用闭环。在使用与学习上给出三点建议保持对保留接口的敬畏这些 API 属于op::internal且官方标注为保留状态算子开发者应通过ADD_TO_LAUNCHER_LIST_AICPU等宏间接使用避免直接耦合内部实现关注缓存相关配置ACLNN_CACHE_LIMIT默认 10000、上限 10000000直接决定任务缓存规模高频动态 Shape 场景下需结合CalcDeviceCacheSize的工作空间预算评估内存占用善用调试开关设置GE_PROFILING_TO_STD_OUT1即可在不改代码的情况下观察 AI CPU 算子各阶段的耗时分布快速定位 FindTask 或 Launch 阶段的异常。若需进一步深入可继续阅读同目录下的 AicpuTask 类文档、AicpuTaskSpace 类文档、aicpu_args_handler 与 aicpu_ext_info_handle并对照源码 aicpu_task.h、aicpu_task.cpp、aicpu_task_base.cpp 及测试样例 test_op_cache.cpp 验证本文所述的各条链路。【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考