FEATURED · 精选文章

CANN opbase 的 `aclOpExecutor::AllocFloatArray`:为算子执行器分配 `aclFloatArray` 浮点数组参数

发布时间 / 2026/9/19 8:08:07
来源 / 创域科博编辑部
栏目 / 资讯中心
CANN opbase 的 `aclOpExecutor::AllocFloatArray`:为算子执行器分配 `aclFloatArray` 浮点数组参数 CANN opbase 的aclOpExecutor::AllocFloatArray为算子执行器分配aclFloatArray浮点数组参数【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbaseAllocFloatArray是 CANN opbase 基础框架库中aclOpExecutor执行器对象提供的资源分配接口用于把一段宿主端float内存拷贝封装为aclFloatArray元数据对象供 aclnn 算子 API 在组装输入参数时使用。本文围绕该接口展开先讲解它在 op_executor.h 中的声明与功能定位再结合 op_executor.cpp 的底层实现、acl_meta.h 的配套 C 接口以及 test_op_executor.cpp 的单元测试完整说明其用法、生命周期、失败处理与常见坑位。1 功能概述执行器对象中的参数盒工厂在 aclnnAscend CANN Neural Network算子调用流程中aclOpExecutor是承载一次算子执行所需的全部输入、输出、属性参数以及 workspace 管理信息的核心对象。为了让开发者不必手动管理各类参数的 C 对象生命周期aclOpExecutor提供了一整套AllocXxx工厂方法统一负责创建对象并接管其生命周期。AllocFloatArray就是其中的一员其职责是分配一个aclFloatArray对象并用指定内存中的浮点数据初始化它。从 op_executor.h 的类定义可以看到与AllocFloatArray并列的还有AllocIntArray(const int64_t* value, uint64_t size)AllocBoolArray(const bool* value, uint64_t size)AllocTensorList(...)、AllocScalarList(...)、AllocScalar(...)等一系列分配接口这些接口共同构成了执行器侧的参数盒argument box工厂aclFloatArray正是用来承载算子中的浮点数组类属性例如某些算子的dim、axes、权重列表等以 float 数组形式表达的属性的元数据对象。2 接口原型与参数说明aclFloatArray *AllocFloatArray(const float *value, uint64_t size)参数输入/输出说明valueInput源数据指针用于初始化aclFloatArray指向一段以float为单位的宿主端内存sizeInput源数据中元素的个数注意是元素个数不是字节数返回值成功返回新分配的aclFloatArray*指针失败返回nullptr。约束条件value输入指针不能为空size必须与value指向的内存实际元素个数一致调用方需保证内存可读。这里需要特别提醒size的语义是元素个数而非字节数。底层在构造aclFloatArray时会按size个float元素每个 4 字节拷贝数据。若误传字节数会造成越界读取。3 底层实现剖析从调用到对象入册AllocFloatArray的实现位于 op_executor.cppaclFloatArray* aclOpExecutor::AllocFloatArray(const float* value, uint64_t size) { aclFloatArray* array nullptr; ADD_TRY_CATCH(array new aclFloatArray(value, size); allocatedObjList_.push_back(array); return array; , OP_LOGE(ACLNN_ERR_INNER, aclOpExecutor::AllocFloatArray failed.); delete array; return nullptr;); }实现逻辑可以拆解为三步构造对象new aclFloatArray(value, size)在堆上创建aclFloatArray实例构造函数内部会从value拷贝size个float元素。生命周期托管allocatedObjList_.push_back(array)把新对象挂到执行器私有的对象列表allocatedObjList_类型为op::FVectorop::Object*, ALLOCATE_OBJ_DEFAULT_SIZE上。这意味着该对象的生命周期由aclOpExecutor统一管理会在执行器析构时一并释放调用方无需也不应手动 delete。异常兜底ADD_TRY_CATCH宏包裹了整个分配流程。一旦构造过程中抛出异常例如内存分配失败会记录OP_LOGE(ACLNN_ERR_INNER, ...)错误日志并释放已分配的对象最终返回nullptr。从实现可以看出失败路径只有异常触发一种异常发生时打印错误码为ACLNN_ERR_INNER的内部错误日志后返回空指针而成功路径返回的指针必然已被加入allocatedObjList_。这也解释了文档中失败返回nullptr的行为来源。3.1 配套的 C 语言接口aclFloatArray类型本身是不透明句柄opaque handle在 acl_meta.h 中以typedef struct aclFloatArray aclFloatArray;前向声明。除AllocFloatArray外仓库还提供了配套的 C 接口用于创建与查询aclCreateFloatArray(const float* value, uint64_t size)——独立创建aclFloatArrayacl_meta.haclDestroyFloatArray(const aclFloatArray* array)——显式销毁acl_meta.haclGetFloatArraySize(const aclFloatArray* array, uint64_t* size)——查询数组元素个数acl_meta.h二者定位不同aclCreateFloatArray是独立的创建手动销毁路径而AllocFloatArray走的是执行器托管路径对象随执行器生命周期释放适合在单次算子调用内临时使用。3.2 与ConvertToTensor的联动aclFloatArray还可以进一步转换为张量参与计算。在 op_executor.h 中声明了ConvertToTensor(const aclFloatArray* value, op::DataType dataType)其底层依赖aclTensor的私有构造函数aclTensor(const aclFloatArray* value, op::DataType dataType)见 common_types.h。也就是说AllocFloatArray分配的浮点数组既可以直接作为数组属性传入算子也可以通过ConvertToTensor转换成张量输入两种用法覆盖了算子参数组装的主要场景。4 使用示例4.1 文档原始示例AllocFloatArray.md 给出的最小示例// Allocate an aclFloatArray with a length of 10. void Func(aclOpExecutor *executor) { float myArray[10]; aclFloatArray *array executor-AllocFloatArray(myArray, 10); }4.2 单元测试中的完整用法在仓库的单元测试 test_op_executor.cpp 中AllocFloatArray与AllocBoolArray、AllocIntArray一起被验证并紧随其后演示了ConvertToTensor的转换用法TEST_F(OpExecutorTest, TestOpExecutor) { op::internal::GetThreadLocalContext().cacheHasFull_ true; aclOpExecutor executor; bool boolValue[] {true, false, true}; auto array1 executor.AllocBoolArray(boolValue, 3); EXPECT_NE(array1, nullptr); float floatValue[] {1, 2, 3}; auto array2 executor.AllocFloatArray(floatValue, 3); EXPECT_NE(array2, nullptr); int64_t intValue[] {1, 2, 3}; auto array3 executor.AllocIntArray(intValue, 3); EXPECT_NE(array3, nullptr); // ... auto tensor6 executor.ConvertToTensor(array2, DataType::DT_FLOAT); EXPECT_NE(tensor6, nullptr); }这段测试给出了几个关键实践点AllocFloatArray在成功路径上返回非空指针测试用EXPECT_NE(array2, nullptr)校验分配出的数组可以紧接着交给ConvertToTensor转成aclTensor此处目标数据类型为DT_FLOAT所有Alloc*出来的对象都挂在同一个executor上统一管理测试结束后随执行器一起释放无需逐一手动清理。5 生命周期与注意事项结合 op_executor.h 中的私有成员allocatedObjList_与allocatedTensorList_可以总结AllocFloatArray的生命周期规则对象所有权归执行器分配出的aclFloatArray被记录在allocatedObjList_中随aclOpExecutor析构统一释放。调用方不要手动delete也不要跨执行器复用以免重复释放或悬垂。输入内存只需在调用期间有效构造函数会拷贝数据因此value指向的内存可以在AllocFloatArray返回后立即复用或释放前提是该aclFloatArray不依赖源内存做零拷贝引用。空指针与元素个数必须匹配value不能为nullptrsize必须是元素个数。若传入空指针或非法大小构造过程会因访问非法内存或异常而失败最终返回nullptr实现见 op_executor.cpp。失败处理由于失败路径返回nullptr调用方在把aclFloatArray传入算子执行或ConvertToTensor之前应先判空。6 总结AllocFloatArray是 CANN opbase 中aclOpExecutor提供的标准数组参数分配接口核心价值在于把创建浮点数组参数对象 生命周期托管 异常兜底封装成一行调用让算子开发者专注于业务参数组装。它与AllocIntArray、AllocBoolArray等接口共用同一套allocatedObjList_托管机制与aclCreateFloatArray/aclDestroyFloatArray的独立 C 接口互补并可通过ConvertToTensor平滑转换为张量参与计算是 aclnn 算子参数组装链路中值得复用的基础能力。进一步阅读接口声明op_executor.h接口实现op_executor.cpp类型与配套 C 接口acl_meta.h、common_types.h中文文档AllocFloatArray.md单元测试test_op_executor.cpp【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻