首页 / 资讯中心 / 文章详情

ASC-STL多维视图与张量搬运完全入门:gm_mdspan、ub_mdspan与tensor_load_async使用指南

ASC-STL多维视图与张量搬运完全入门:gm_mdspan、ub_mdspan与tensor_load_async使用指南 ★ FEATURED ARTICLE
标准库并发编程高性能计算Ascend【免费下载链接】asc-stl武汉理工大学熊盛武课题组携手华为 CANN 团队开发 Ascend C 编程标准库。本项目提供可运行于昇腾 NPU 设备的 C/C 标准实现且提供昇腾 NPU 特有硬件特性的抽象化实现项目地址https://gitcode.com/cann/asc-stl点击查看免费下载本文带你快速上手asc-stlAscend C 编程标准库中面向昇腾 NPU 的多维数据视图与张量搬运能力通过gm_mdspan描述全局内存GM中的多维张量用ub_mdspan描述片上统一缓冲UB数据再借助tensor_load_async把多维数据异步地从 GM 搬到 UB是编写高性能 Ascend C 算子的重要基础。这套接口由武汉理工大学熊盛武课题组与华为 CANN 团队联合开发当前在 Ascend 950PR950DT 系列产品上可用。为什么要学多维视图与张量搬运 在昇腾 NPU 上AI Core 的计算数据存放在片上的UBUnified Buffer而输入输出数据通常在GMGlobal Memory。手写搬运逻辑时你要手动处理行偏移、步长、填充……一旦张量超过一维代码很快就难以维护。asc-stl 把这件事抽象成两块能力都位于昇腾扩展接口层asc/mdspan非拥有多维数据视图按地址空间细分为host_mdspan、gm_mdspan、ub_mdspan三种别名分别对应 Host、GM 与 UB 空间asc/tensor_copy支持 1~5 维形状、源/目标步长与两侧填充的 GM 与 UB 异步搬运核心函数为tensor_load_asyncGM→UB和tensor_store_asyncUB→GM。从整体架构看这两个头文件正好落在多维数据视图与搬运模块中gm_mdspan给 GM 里的数据加上多维坐标 gm_mdspan本质上是一个带gm_accessor访问器的 mdspan 别名它不拥有存储只是给一段 GM 连续内存加上多维坐标系让你可以用view(i, j)的方式访问矩阵、张量而不必自己算偏移。头文件asc/mdspan源码入口 include/asc/mdspan模板参数元素类型Element、维度描述Extents、布局Layout默认行优先、访问器默认gm_accessor典型用法用extents指定各维大小后构造视图随后用view.extent(0)、view.size()、view[i, j]等标准接口访问数据一个最小示例摘自官方文档Host 侧同样可运行验证#include asc/mdspan using view_type asc::gm_mdspanint, asc::std::extentsasc::std::size_t, 4; view_type view(values); view[2] 35; // 按坐标访问无需手动算偏移完整定义与约束见 gm_mdspan.md。ub_mdspan以同样方式描述片上 UB 数据 ub_mdspan与gm_mdspan是姊妹接口它使用ub_accessor访问 UB 数据。区别在于SIMD 编程模式下句柄保留真实 UB 地址空间__ubuf__可以直接访问片上缓冲Host 侧仅提供普通指针表示不能直接访问设备物理 UB适合做逻辑验证SIMT 编程模式不提供 UB 访问器ub_mdspan仅面向 AI Core SIMD 编程。这意味着同一个算子开发流程中GM 侧输入、UB 侧工作区可以用完全一致的多维索引风格书写代码可读性大幅提升。接口文档见 ub_mdspan.md。tensor_load_asyncGM→UB 的异步多维搬运 ⚡tensor_load_async是按搬运描述符tensor_copy_descriptor把多维张量从 GM 异步加载到 UB 的函数相比逐行copy_async它原生支持能力说明多维形状支持 Rank 为 1~5 的张量步长解耦源/目标步长可独立设置天然支持行距、非连续布局两侧填充每维可指定left_padding/right_padding用fill_value填充 UB 边界流水线集成通过pipeline_refstage提交到 GM-UB 流水线的指定级三步走描述符 → 提交 → 同步构造描述符用 make_tensor_copy_descriptor 传入各维extents、源/目标strides和padding数组即可得到描述搬运计划的tensor_copy_descriptorRank它还能通过required_elements()告诉你需要多大缓冲提交异步加载调用asc::tensor_load_asyncint, Rank(pipeline, stage, ub目标, gm源, descriptor, fill_value)返回tensor_copy_status表示提交状态提交成功 ≠ 搬运完成按流水线协议同步重用流水级前先producer_acquire(stage)成功提交后consumer_wait(stage)等待完成再执行计算。官方文档中的设备端示例2 维、16 个整数的 GM→UB 加载__aicore__ asc::tensor_copy_status example(const asc::pipeline_ref pipeline, __ubuf__ int* destination, __gm__ const int* source) { const unsigned int extents[2] {2, 8}; const unsigned int strides[2] {8, 1}; const unsigned int padding[2] {0, 0}; const auto descriptor asc::make_tensor_copy_descriptor(extents, strides, strides, padding, padding); return asc::tensor_load_asyncint, 2(pipeline, 0, asc::ub_spanint(destination, 16), asc::gm_spanconst int(source, 16), descriptor, 0); }完整参数、状态码与约束见 tensor_load_async.md。新手最易踩的 4 个坑 ⚠️32 字节对齐GM/UB 两端地址必须落在搬运引擎的 32 字节数据块边界上否则会返回insufficient_source/insufficient_destinationstage 越界stage必须小于流水线的级数否则返回invalid_stage且不发起搬运容量核算UB 目标容量要按目标步长 两侧填充折算可用descriptor.required_elements()精确计算GM 源容量按源步长、不含填充折算同步协议顺序提交成功后才能consumer_wait(stage)失败状态不能继续等待未提交的事件完成计算后用tensor_store_async回写或按协议consumer_release。延伸阅读相关模块速查 想深入了解去哪看asc/mdspan全部视图/访问器接口含host_mdspan、restrict_mdspan、DLPack 转换asc_mdspan 头文件说明asc/tensor_copy全部搬运接口与状态码asc_tensor_copy 头文件说明gm_span/ub_span一维连续内存视图地址空间与内存视图模块总览多维数据视图与搬运multidimensional_views_and_transfer项目文档首页docs/zh/api/api_list.md小结gm_mdspan与ub_mdspan为 GM 和 UB 两侧数据提供统一的多维索引体验tensor_load_async则把多维形状、步长和填充的复杂搬运交给硬件描述符表达。三者配合流水线pipeline使用就是你在 Ascend 950 系列上编写高效 AI Core 算子的标准姿势。赞分享标准库并发编程高性能计算Ascend【免费下载链接】asc-stl武汉理工大学熊盛武课题组携手华为 CANN 团队开发 Ascend C 编程标准库。本项目提供可运行于昇腾 NPU 设备的 C/C 标准实现且提供昇腾 NPU 特有硬件特性的抽象化实现项目地址https://gitcode.com/cann/asc-stl点击查看免费下载相关推荐asc-devkit DataCopy 切片数据搬运实战GM↔UB 多维 Tensor 子集搬运原理与样例解析asc devkit DataCopy 切片数据搬运实战GM↔UB 多维 Tensor 子集搬运原理与样例解析 DataCopy切片数据搬运是 Ascen人工智能深度学习高性能计算CANNAscend C 向量加法算子入门实战Add 样例的搬入-计算-搬出流水实现与多核并行解析asc-devkitAscend C 向量加法算子入门实战Add 样例的搬入 计算 搬出流水实现与多核并行解析asc devkit 本篇文章基于 asc devkit 仓人工智能深度学习高性能计算CANNAscend C 入门实战asc-devkit 仓库 Add 向量加法算子样例全解析搬入-计算-搬出三段式流水Ascend C 入门实战asc devkit 仓库 Add 向量加法算子样例全解析搬入 计算 搬出三段式流水 导读 本文以 asc devkit 开源仓人工智能深度学习高性能计算CANN上一篇Lynx 时序基础设施源码指南深入 timing_handler 模块的 TimingMap、TimingInfo 与 NG 执行路径下一篇Folia 歌词动画播放器全平台安装指南Windows、macOS、Linux 三步装好创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?
咨询建站