ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

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

ASC-STL多维视图与张量搬运完全入门:gm_mdspan、ub_mdspan与tensor_load_async使用指南
  • 标准库
  • 并发编程
  • 高性能计算
  • Ascend

【免费下载链接】asc-stl

武汉理工大学熊盛武课题组携手华为 CANN 团队开发 Ascend C 编程标准库。本项目提供可运行于昇腾 NPU 设备的 C/C++ 标准实现,且提供昇腾 NPU 特有硬件特性的抽象化实现

项目地址:https://gitcode.com/cann/asc-stl
点击查看免费下载

本文带你快速上手asc-stl(Ascend C 编程标准库)中面向昇腾 NPU 的多维数据视图与张量搬运能力:通过gm_mdspan描述全局内存(GM)中的多维张量,用ub_mdspan描述片上统一缓冲(UB)数据,再借助tensor_load_async把多维数据异步地从 GM 搬到 UB,是编写高性能 Ascend C 算子的重要基础。这套接口由武汉理工大学熊盛武课题组与华为 CANN 团队联合开发,当前在 Ascend 950PR&950DT 系列产品上可用。

为什么要学多维视图与张量搬运 🚀

在昇腾 NPU 上,AI Core 的计算数据存放在片上的UB(Unified Buffer),而输入输出数据通常在GM(Global Memory)。手写搬运逻辑时,你要手动处理行偏移、步长、填充……一旦张量超过一维,代码很快就难以维护。

asc-stl 把这件事抽象成两块能力,都位于昇腾扩展接口层:

  • <asc/mdspan>:非拥有多维数据视图,按地址空间细分为host_mdspan、gm_mdspan、ub_mdspan三种别名,分别对应 Host、GM 与 UB 空间;
  • <asc/tensor_copy>:支持 1~5 维形状、源/目标步长与两侧填充的 GM 与 UB 异步搬运,核心函数为tensor_load_async(GM→UB)和tensor_store_async(UB→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_mdspan<int, asc::std::extents<asc::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_async:GM→UB 的异步多维搬运 ⚡

tensor_load_async是按搬运描述符(tensor_copy_descriptor)把多维张量从 GM 异步加载到 UB 的函数,相比逐行copy_async,它原生支持:

能力说明
多维形状支持 Rank 为 1~5 的张量
步长解耦源/目标步长可独立设置,天然支持行距、非连续布局
两侧填充每维可指定left_padding/right_padding,用fill_value填充 UB 边界
流水线集成通过pipeline_ref+stage提交到 GM-UB 流水线的指定级

三步走:描述符 → 提交 → 同步

  1. 构造描述符:用 make_tensor_copy_descriptor 传入各维extents、源/目标strides和padding数组,即可得到描述搬运计划的tensor_copy_descriptor<Rank>,它还能通过required_elements()告诉你需要多大缓冲;
  2. 提交异步加载:调用asc::tensor_load_async<int, Rank>(pipeline, stage, ub目标, gm源, descriptor, fill_value),返回tensor_copy_status表示提交状态(提交成功 ≠ 搬运完成);
  3. 按流水线协议同步:重用流水级前先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_async<int, 2>(pipeline, 0, asc::ub_span<int>(destination, 16), asc::gm_span<const int>(source, 16), descriptor, 0); }

完整参数、状态码与约束见 tensor_load_async.md。

新手最易踩的 4 个坑 ⚠️

  1. 32 字节对齐:GM/UB 两端地址必须落在搬运引擎的 32 字节数据块边界上,否则会返回insufficient_source/insufficient_destination;
  2. stage 越界:stage必须小于流水线的级数,否则返回invalid_stage且不发起搬运;
  3. 容量核算:UB 目标容量要按目标步长 + 两侧填充折算(可用descriptor.required_elements()精确计算),GM 源容量按源步长、不含填充折算;
  4. 同步协议顺序:提交成功后才能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
点击查看免费下载

相关推荐

上一篇:Lynx 时序基础设施源码指南:深入 timing_handler 模块的 TimingMap、TimingInfo 与 NG 执行路径
下一篇:Folia 歌词动画播放器全平台安装指南:Windows、macOS、Linux 三步装好

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进