ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

CANN opbase aclnn 公共接口 aclGetBoolArraySize 详解:获取 aclBoolArray 布尔数组长度

CANN opbase aclnn 公共接口 aclGetBoolArraySize 详解:获取 aclBoolArray 布尔数组长度 CANN opbase aclnn 公共接口 aclGetBoolArraySize 详解获取 aclBoolArray 布尔数组长度【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase导读本文深入解析 CANN 算子库基础框架opbase中 aclnn 公共接口aclGetBoolArraySize的声明、参数语义、返回值与源码级实现原理。该接口用于获取由 aclCreateBoolArray 创建的aclBoolArray布尔数组的大小元素个数是单算子 API 调用流程中校验与获取布尔型入参数组信息的关键一环。读完本文你将掌握aclGetBoolArraySize的完整用法、空指针失败场景的返回码161001含义以及它与创建、销毁接口配合的完整生命周期写法。功能说明布尔数组大小的读取入口aclBoolArray是 CANN opbase 框架定义的一种用于管理和存储布尔型数据的数组结构作为单算子 APIaclnn执行接口的入参使用开发者无需关注其内部实现细节直接通过公共接口操作即可。aclGetBoolArraySize用于获取一个已创建的aclBoolArray的大小即其中 bool 元素的个数。该接口通常与以下两个接口配套构成完整的生命周期aclCreateBoolArray创建aclBoolArrayaclDestroyBoolArray销毁aclBoolArray。在单算子调用场景中aclBoolArray常被用作算子属性如掩码 mask 数据的载体传入执行接口在组装参数或调试时通过aclGetBoolArraySize可以反向确认数组实际承载的元素个数例如校验创建时传入的 size 是否与预期一致。函数原型aclnnStatus aclGetBoolArraySize(const aclBoolArray *array, uint64_t *size)该接口以 C 语言形式对外暴露声明位于仓库头文件 include/nnopbase/aclnn/acl_meta.h 中ACL_FUNC_VISIBILITY aclnnStatus aclGetBoolArraySize(const aclBoolArray* array, uint64_t* size);同时aclBoolArray类型本身也在同一头文件中以不透明结构体opaque struct的形式声明typedef struct aclBoolArray aclBoolArray;开发者只能通过公共接口操作该类型无法直接访问其内部成员这正是无需关注内部实现的设计体现。参数说明参数名输入/输出说明array输入输入的aclBoolArray即通过 aclCreateBoolArray 创建得到的对象指针。size输出输出参数用于接收返回的aclBoolArray大小元素个数类型为uint64_t。调用前需由调用方分配栈上变量并初始化为 0。使用要点array必须指向一个有效已成功创建且尚未销毁的aclBoolArray传入空指针将导致接口失败返回码见下文size是输出型参数不能传入nullptr否则同样会被判定为参数非法返回的大小为创建该数组时指定的元素个数即aclCreateBoolArray的第二个参数size的取值。返回值说明返回0即ACLNN_SUCCESS表示成功返回其他值表示失败。返回码列表参见 公共接口返回码。可能失败的原因返回161001ACLNN_ERR_PARAM_NULLPTR参数array或size为空指针。常见返回码对照如下状态码名称状态码值状态码说明ACLNN_SUCCESS0成功。ACLNN_ERR_PARAM_NULLPTR161001参数校验错误参数中存在非法的 nullptr。ACLNN_ERR_PARAM_INVALID161002参数校验错误如输入的两个数据类型不满足输入类型推导关系。ACLNN_ERR_RUNTIME_ERROR361001API 内存调用 npu runtime 的接口异常。ACLNN_ERR_INNER_XXX561xxxAPI 发生内部异常。说明接口失败时可通过《Runtime 运行时 API》中的aclGetRecentErrMsg接口获取更详细的异常信息便于排查问题。源码实现原理从源码结构看aclGetBoolArraySize的实际实现在 src/nnopbase/common/api/acl_op_api.cpp 中逻辑非常简洁aclnnStatus aclGetBoolArraySize(const aclBoolArray* array, uint64_t* size) { if (array nullptr || size nullptr) { return ACLNN_ERR_PARAM_NULLPTR; } *size array-Size(); return OK; }该实现揭示了以下关键事实空指针校验先行接口在访问对象前会同时校验array与size两个指针任一为nullptr即直接返回ACLNN_ERR_PARAM_NULLPTR数值为 161001与文档中返回 161001参数 array 或 size 为空指针的描述完全一致大小来源于对象内部Size()方法成功时直接通过array-Size()获取元素个数并写入输出参数不涉及任何内存分配因此本接口是 O(1) 时间复杂度的轻量读取操作返回值语义统一OK即宏常量0定义于 include/nnopbase/aclnn/acl_meta.h与返回 0 表示成功的文档约定对应。作为对照同头文件中aclGetIntArraySize、aclGetFloatArraySize、aclGetTensorListSize、aclGetScalarListSize等接口的实现模式完全一致均采用空指针校验 调用对象Size()方法的结构aclGetBoolArraySize是这一组元数据读取接口家族中的一员。在 opbase 的算子框架内部aclBoolArray还被广泛用于算子属性组装例如 include/nnopbase/opdev/op_arg_def.h 中提供了从aclBoolArray*/const aclBoolArray*构造OpArgValue的隐式转换include/nnopbase/opdev/aicpu/aicpu_task.h 中则提供了将aclBoolArray追加到缓存键cache key与 Aicpu 属性的工具函数体现了该结构在参数传递链路中的实际用途。调用示例以下关键代码示例仅供参考完整工程中不支持直接拷贝运行请结合单算子 API 的真实接口名与参数调整。// 1. 创建 aclBoolArray bool maskData[] {true, false}; aclBoolArray *mask aclCreateBoolArray(maskData, sizeof(maskData) / sizeof(maskData[0])); // 2. 使用 aclGetBoolArraySize 接口获取 mask 的大小 uint64_t size 0; auto ret aclGetBoolArraySize(mask, size); // 获取到的 mask 的 size 为 2 if (ret ! 0) { // 处理失败ret 可能为 161001array 或 size 为空指针 } // 3. aclBoolArray 作为单算子 API 执行接口的入参 // ret aclxxXxxGetWorkspaceSize(srcTensor, mask, ..., outTensor, ..., workspaceSize, executor); // ret aclxxXxx(...); // 4. 销毁 aclBoolArray ret aclDestroyBoolArray(mask);代码流程拆解创建阶段以bool数组{true, false}及元素个数 2 调用aclCreateBoolArray获得aclBoolArray*指针。注意aclCreateBoolArray会将 Host 侧指针value指向的值拷贝进对象内部详见 aclCreateBoolArray 的参数说明因此原始数组在创建后可以被安全复用或释放读取阶段声明并初始化uint64_t size 0后调用aclGetBoolArraySize接口将元素个数 2 写入size实现上等价于读取mask-Size()使用阶段aclBoolArray可直接作为单算子 API 执行接口的入参传入示例中为示意性的aclxxXxxGetWorkspaceSize/aclxxXxx调用销毁阶段调用 aclDestroyBoolArray 释放对象。从 acl_op_api.cpp 的实现可见aclDestroyBoolArray对空指针入参是安全的直接返回成功且在开启 aclnn 调试IsAclnnDebugEnabled时会通过CheckDoubleFree检测可能的重复释放double-free并输出告警日志因此务必保证一创一销、不重复销毁。约束说明与使用建议aclGetBoolArraySize本身的约束为无但围绕其完整使用场景有以下实践建议生命周期配对aclBoolArray必须与 aclDestroyBoolArray 配套使用分别完成创建与销毁参见 aclCreateBoolArray 的约束说明先判空再使用输出值接口失败时size输出值不可信赖应先检查返回值是否为 0ACLNN_SUCCESS再使用size调试辅助在算子参数组装链路中若传入的aclBoolArray由框架内部例如通过 AllocBoolArray 等接口生成可借助本接口快速确认元素个数避免出现掩码长度与算子预期不符的隐性问题。小结aclGetBoolArraySize是 CANN opbase aclnn 公共接口中针对布尔数组的轻量查询接口入参为aclBoolArray与输出指针size成功返回 0空指针时返回 161001。其源码实现在 src/nnopbase/common/api/acl_op_api.cpp本质是对array-Size()的封装。将它与 aclCreateBoolArray、aclDestroyBoolArray 组合使用即可完整覆盖布尔型掩码数据在单算子调用中的创建、读取与销毁全流程。【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表