opbase aclnn 张量元数据接口解析:aclGetFormat 获取 aclTensor 数据布局格式的原理与实践
opbase aclnn 张量元数据接口解析aclGetFormat 获取 aclTensor 数据布局格式的原理与实践【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase本篇围绕 CANN opbase 仓库中 aclnn 公共 APIaclGetFormat展开它用于读取通过aclCreateTensor创建的aclTensor对象所携带的数据布局格式aclFormat。读完本文你将掌握该接口的原型、参数与错误码语义、在“复制张量属性创建新张量”场景下的完整用法以及从源码层面理解格式转换内部Format到aclFormat的实现细节和单元测试验证方式。接口功能与定位aclGetFormat是 aclnn 元数据MetaAPI 族中的一员作用是获取 aclTensor 创建时指定的数据布局格式。与aclGetDataType、aclGetViewShape、aclGetViewStrides、aclGetViewOffset、aclGetStorageShape等接口并列它共同构成了一组“只读访问张量属性”的查询接口其典型用途是先创建一张张量再逐项读出它的属性据此构造另一张属性相同的张量例如在动态 shape/动态地址场景下重建张量描述。接口原型定义如下aclnnStatus aclGetFormat(const aclTensor *tensor, aclFormat *format)该原型在公开头文件 acl_meta.h 中声明aclnnStatus为int32_t类型返回 0 表示成功见 acl_meta.h。参数说明参数输入/输出说明tensor输入输入 aclTensor即需要查询格式的对象通常由 aclCreateTensor 创建。format输出返回该 aclTensor 的数据布局格式aclFormat由调用方提供可写指针。需要注意两点语义查询的是“视图格式”而非存储格式。从源码实现看接口内部读取的是张量的视图格式字段GetViewFormat()与aclCreateTensor的format参数对应的是同一概念张量逻辑视图的布局而不是物理存储侧的属性format指针不可为 null。两个参数任一为nullptr都会导致调用失败并返回错误码 161001下文详述。返回值与错误码成功返回0ACLNN_SUCCESS失败返回非 0 错误码具体含义可参考 Common API Return Codes。该接口最可能出现的失败原因是空指针参数错误码161001ACLNN_ERR_PARAM_NULLPTRtensor或format为 null 指针时返回。该错误码在仓库的错误码文档中定义为“Parameter verification error. Parameters contain invalidnullptr”完整错误码表见 common_api_return_codes.md同表还包含161002参数校验错误、361001NPU Runtime 异常、561xxx内部异常等可一并了解 aclnn 公共 API 的返回码体系。文档标注该接口无使用限制Restrictions: None。源码实现解析空指针校验与格式转换aclGetFormat的实现位于 acl_op_api.cpp核心逻辑非常简洁aclnnStatus aclGetFormat(const aclTensor* tensor, aclFormat* format) { if (tensor nullptr || format nullptr) { return ACLNN_ERR_PARAM_NULLPTR; } *format op::ToAclFormat(tensor-GetViewFormat()); return OK; }从源码结构看该实现包含两层关键信息参数校验对tensor、format做空指针检查任一为空直接返回ACLNN_ERR_PARAM_NULLPTR即 161001与文档描述完全一致内部格式到 aclFormat 的转换真正的取值动作是op::ToAclFormat(tensor-GetViewFormat())。aclTensor内部以 opbase 自己的Format枚举保存格式而 aclnn 对外暴露的是aclFormat枚举二者需要一个显式映射函数衔接。这个映射函数ToAclFormat定义在 format_utils.h它是一个带“白名单”的转换inline aclFormat ToAclFormat(Format format) { static const std::vectorFormat CAN_CONVERT_TO_ACL_FORMAT_LIST {Format::FORMAT_NCHW, Format::FORMAT_NHWC, Format::FORMAT_ND, Format::FORMAT_NC1HWC0, Format::FORMAT_FRACTAL_Z, Format::FORMAT_NC1HWC0_C04, Format::FORMAT_HWCN, Format::FORMAT_NDHWC, Format::FORMAT_FRACTAL_NZ, Format::FORMAT_NCDHW, Format::FORMAT_NDC1HWC0, Format::FORMAT_FRACTAL_Z_3D, Format::FORMAT_NC, Format::FORMAT_NCL, Format::FORMAT_FRACTAL_NZ_C0_16, Format::FORMAT_FRACTAL_NZ_C0_32, Format::FORMAT_FRACTAL_NZ_C0_2, Format::FORMAT_FRACTAL_NZ_C0_4, Format::FORMAT_FRACTAL_NZ_C0_8}; auto iter std::find(CAN_CONVERT_TO_ACL_FORMAT_LIST.begin(), CAN_CONVERT_TO_ACL_FORMAT_LIST.end(), format); if (iter CAN_CONVERT_TO_ACL_FORMAT_LIST.end()) { return aclFormat::ACL_FORMAT_UNDEFINED; } return static_castaclFormat(format); }由此可以推断出对使用者有意义的行为细节内部Format与aclFormat在白名单内的 19 种格式上数值一一对应直接static_cast例如FORMAT_ND映射为ACL_FORMAT_ND、FORMAT_NC1HWC0映射为ACL_FORMAT_NC1HWC0若张量内部保存的格式不在白名单内例如某些仅内部使用、未对外暴露的格式aclGetFormat不会报错而是返回ACL_FORMAT_UNDEFINED。因此在业务代码中用ACL_FORMAT_UNDEFINED初始化出参并在使用前判断是否被正确填充是稳妥的防御式写法同文件中的逆映射ToOpFormatformat_utils.h则是“非ACL_FORMAT_UNDEFINED直接强转为内部格式、否则返回FORMAT_MAX”两者共同保证 aclTensor 创建aclCreateTensor传入aclFormat与查询aclGetFormat返回aclFormat之间的格式语义闭环。实战示例读取属性并据此创建新张量官方文档给出的典型场景是假设已有一个aclTensor对象xTensor需要读取它的数据类型、数据布局格式、维度、stride、offset 等属性并基于这些属性创建一个新的aclTensor对象yTensor。完整示例代码如下该示例仅供参考不可直接复制运行实际工程中需结合设备地址申请等上下文// 1. Create an xTensor. int64_t xViewDims {2, 4}; int64_t xStridesValue {4, 1}; // The stride of the first dimension is 4, and that of the second dimension is 1. int64_t xStorageDims {2, 4}; xTensor aclCreateTensor(xViewDims, 2, ACL_FLOAT16, xStridesValue, 0, ACL_FORMAT_ND, xStorageDims, 2, nullptr); // 2. Obtain the attribute values of xTensor. // Obtain the logical shape of xTensor. viewDims is {2, 4}, and viewDimsNum is 2. int64_t *viewDims nullptr; uint64_t viewDimsNum 0; auto ret aclGetViewShape(xTensor, viewDims, viewDimsNum); // Obtain the data type (ACL_FLOAT16) of xTensor. aclDataType dataType aclDataType::ACL_DT_UNDEFINED; ret aclGetDataType(xTensor, dataType); // Obtain the stride information about xTensor. stridesValue is {4, 1}, and stridesNum is 2. int64_t *stridesValue nullptr; uint64_t stridesNum 0; ret aclGetViewStrides(xTensor, stridesValue, stridesNum); // Obtain the offset of the first element of xTensor relative to storage. The offset is 0. int64_t offset 0; ret aclGetViewOffset(xTensor, offset); // Obtain the data layout format (ACL_FORMAT_ND) of xTensor. aclFormat format aclFormat::ACL_FORMAT_UNDEFINED; ret aclGetFormat(xTensor, format); // Obtain the actual physical shape of xTensor. storageDims is {2, 4}, and storageDimsNum is 2. int64_t *storageDims nullptr; uint64_t storageDimsNum 0; ret aclGetStorageShape(xTensor, storageDims, storageDimsNum); // Device address void *deviceAddr; // 3. Create a tensor based on the xTensor attributes. aclTensor *yTensor aclCreateTensor(viewDims, viewDimsNum, dataType, stridesValue, offset, format, storageDims, storageDimsNum, deviceAddr); // 4. Manually free memory. delete[] viewDims; delete[] stridesValue; delete[] storageDims;示例中有几个值得注意的实战要点出参内存由调用方管理aclGetViewShape、aclGetViewStrides、aclGetStorageShape这类“形状/步长”查询接口会把内部缓冲new出来并通过指针返回例如 aclGetStorageShape 中的new (std::nothrow) int64_t[storageCount]因此示例末尾必须手动delete[]释放viewDims、stridesValue、storageDims三块内存而aclGetFormat、aclGetDataType、aclGetViewOffset只写一个值不涉及动态分配属性读取与重建的顺序先取出全部属性包括format再用这些属性调用 aclCreateTensor 重建张量重建时最后传入的是新的设备地址deviceAddr——这正是该接口在“张量对象复用/换址重建”类流程中的价值aclTensor只是元数据描述数据本体由deviceAddr指向逐次检查返回值示例用ret逐个接收各查询接口的aclnnStatus生产代码中应像单元测试那样对每次调用做断言或错误处理避免带着失败状态继续重建张量。单元测试验证仓库中的单元测试 test_acl_op_api.cpp 直接覆盖了aclGetFormat的两类关键行为可与上文源码实现相互印证TEST_F(AclOpApiTest, aclGetFormat) { EXPECT_NE(aclGetFormat(nullptr, nullptr), OK); std::vectorint64_t strides {8, 1}; CHECK_TENSOR(a, std::vectorint64_t({4, 2}), std::vectorint64_t({32}), aclDataType::ACL_FLOAT, strides.data(), 0, aclFormat::ACL_FORMAT_ND, nullptr); aclFormat formatRes aclFormat::ACL_FORMAT_UNDEFINED; EXPECT_EQ(aclGetFormat(a, formatRes), OK); EXPECT_EQ(formatRes, aclFormat::ACL_FORMAT_ND); }测试断言了两点其一双空指针调用必须失败EXPECT_NE(..., OK)对应实现中的ACLNN_ERR_PARAM_NULLPTR分支其二以ACL_FORMAT_ND创建的张量查询结果原样返回ACL_FORMAT_ND且状态码为OK验证了白名单内格式的无损往返。该测试同时出现在集成测试 st/composite_op/test_acl_op_api.cpp 中说明这一行为契约在单元与系统两级测试中都被持续守护。小结aclGetFormat虽是一个几行的轻量接口但它处在 aclnn 张量元数据体系的枢纽位置它是aclCreateTensor传入的aclFormat的“回读”通道也是张量属性复制流程中的必备一环。掌握它的关键有三条——参数任一为空返回161001内部通过ToAclFormat白名单完成Format到aclFormat的映射、白名单外格式得到ACL_FORMAT_UNDEFINED与aclGetViewShape等兄弟接口配合使用完毕后注意释放由形状/步长查询接口分配的出参内存。相关实现与测试分别位于 acl_op_api.cpp、format_utils.h 和 test_acl_op_api.cpp可作为进一步深入源码的入口。【免费下载链接】opbase本项目是CANN算子库的基础框架库为算子提供公共依赖文件和基础调度能力。项目地址: https://gitcode.com/cann/opbase创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Windows更改电脑用户名:C:\Users中文路径修复与账户迁移指南

Windows更改电脑用户名:C:\Users中文路径修复与账户迁移指南

上周帮同事远程处理一台装不上 PyTorch 的机器,报错信息里那串OSError: [WinError 1114] 动态链接库(DLL)初始化例程失败后面跟着的路径,我一眼就看出病根了——C:\Users\24303\.conda\envs\pytorch\lib\site-packages\torch\lib\c10.dll。那个24303是拿…

2026/9/18 9:09:56 阅读更多 →
编写Apache Ossie转换器的9步法:官方完整指南解读

编写Apache Ossie转换器的9步法:官方完整指南解读

编写Apache Ossie转换器的9步法:官方完整指南解读 【免费下载链接】ossie Apache Ossie, industry wide specification effort to standardize how we exchange semantic metadata across analytics, AI and BI platforms, providing a vendor neutral, single sour…

2026/9/18 9:09:56 阅读更多 →
scikit-learn 核近似(Kernel Approximation)完全指南:从 Nystroem 到 Tensor Sketch 的大规模非线性学习

scikit-learn 核近似(Kernel Approximation)完全指南:从 Nystroem 到 Tensor Sketch 的大规模非线性学习

scikit-learn 核近似(Kernel Approximation)完全指南:从 Nystroem 到 Tensor Sketch 的大规模非线性学习 【免费下载链接】scikit-learn scikit-learn: machine learning in Python 项目地址: https://gitcode.com/gh_mirrors/sc/scikit-le…

2026/9/18 9:09:56 阅读更多 →

最新新闻

Cherry Studio Agent 配置热更新:已打开会话如何即时生效配置修改

Cherry Studio Agent 配置热更新:已打开会话如何即时生效配置修改

Cherry Studio Agent 配置热更新:已打开会话如何即时生效配置修改 【免费下载链接】cherry-studio 🍒 Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端 项目地址: https://gitcode.com/CherryHQ/cherry-studio 导读 本篇技术指南聚焦 Cher…

2026/9/19 12:07:26 阅读更多 →
Wails v3 Environment API 实战:环境信息检测与 macOS 透明背景示例解析

Wails v3 Environment API 实战:环境信息检测与 macOS 透明背景示例解析

Wails v3 Environment API 实战:环境信息检测与 macOS 透明背景示例解析 【免费下载链接】wails Create beautiful applications using Go 项目地址: https://gitcode.com/gh_mirrors/wa/wails 导读 本指南基于 Wails v3 仓库中的 environment 示例&#xf…

2026/9/19 12:07:26 阅读更多 →
Gollum快速上手教程:3个命令搭建你的Git驱动Wiki

Gollum快速上手教程:3个命令搭建你的Git驱动Wiki

Gollum快速上手教程:3个命令搭建你的Git驱动Wiki 【免费下载链接】gollum A simple, Git-powered wiki with a local frontend and support for many kinds of markup and content. 项目地址: https://gitcode.com/gh_mirrors/go/gollum Gollum 是一个用 Rub…

2026/9/19 12:07:26 阅读更多 →
Podman 容器组主机名配置全解:`podman pod create/clone --hostname` 选项深度解析

Podman 容器组主机名配置全解:`podman pod create/clone --hostname` 选项深度解析

Podman 容器组主机名配置全解:podman pod create/clone --hostname 选项深度解析 【免费下载链接】podman Podman: A tool for managing OCI containers and pods. 项目地址: https://gitcode.com/gh_mirrors/po/podman 导读 在 Podman 的 Pod(容…

2026/9/19 12:07:26 阅读更多 →
RooCode实战:从Agent原理到自定义配置的AI编程助手指南

RooCode实战:从Agent原理到自定义配置的AI编程助手指南

1. 为什么我建议你试试 RooCode 这个AI开发工具先说个背景吧。最近两年,AI编程工具一下子冒出来不少,从早期的补全插件到后来的对话式编程,再到能自主读写文件、执行命令的Agent型工具,迭代速度非常快。我自己在Cursor、GitHub Co…

2026/9/19 12:07:26 阅读更多 →
React Boilerplate 部署实战指南:Heroku、AWS S3、子目录与 Elastic Beanstalk 全流程

React Boilerplate 部署实战指南:Heroku、AWS S3、子目录与 Elastic Beanstalk 全流程

React Boilerplate 部署实战指南:Heroku、AWS S3、子目录与 Elastic Beanstalk 全流程 【免费下载链接】react-boilerplate 🔥 A highly scalable, offline-first foundation with the best developer experience and a focus on performance and best p…

2026/9/19 12:06:26 阅读更多 →

日新闻

BP神经网络时序预测:滑窗长度与多窗口平均策略

BP神经网络时序预测:滑窗长度与多窗口平均策略

简介:面向机器学习、深度学习与数据建模学习者的一份完整研究文献,聚焦BP神经网络在农业产量预测中的应用。文档以1980—2018年全国棉花产量为样本,系统讲解数据归一化处理、激活函数原理、多层神经网络结构搭建及训练流程,展示敏…

2026/9/19 0:00:30 阅读更多 →
Transformer训练实时监控实战:基于MindSpore的损失曲线可视化方案

Transformer训练实时监控实战:基于MindSpore的损失曲线可视化方案

上个月调一个Deformable DETR模型,在单卡上要跑将近两天。第二天早上我下意识打开终端翻日志,发现loss从凌晨两点就开始往上爬,一路从0.8涨到1.35,整整六个小时没人发现。那六个小时的训练不仅白跑,还霸占着卡——等于…

2026/9/19 0:00:30 阅读更多 →
OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南

OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南

OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南 【免费下载链接】opencloud 🌤️ OpenCloud is the open source platform for file management, sharing and collaboration. Simple and sovereign. 项目地址: htt…

2026/9/19 0:00:30 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/19 3:59:36 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/19 3:53:08 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/19 4:02:43 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/16 22:31:27 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/15 21:39:18 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/16 22:32:59 阅读更多 →