- 标准库
- 并发编程
- 高性能计算
- Ascend
【免费下载链接】asc-stl
武汉理工大学熊盛武课题组携手华为 CANN 团队开发 Ascend C 编程标准库。本项目提供可运行于昇腾 NPU 设备的 C/C++ 标准实现,且提供昇腾 NPU 特有硬件特性的抽象化实现
本文带你快速上手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 流水线的指定级 |
三步走:描述符 → 提交 → 同步
- 构造描述符:用 make_tensor_copy_descriptor 传入各维
extents、源/目标strides和padding数组,即可得到描述搬运计划的tensor_copy_descriptor<Rank>,它还能通过required_elements()告诉你需要多大缓冲; - 提交异步加载:调用
asc::tensor_load_async<int, 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_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 个坑 ⚠️
- 32 字节对齐:GM/UB 两端地址必须落在搬运引擎的 32 字节数据块边界上,否则会返回
insufficient_source/insufficient_destination; - stage 越界:
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 特有硬件特性的抽象化实现
相关推荐
asc-devkit DataCopy 切片数据搬运实战:GM↔UB 多维 Tensor 子集搬运原理与样例解析
asc devkit DataCopy 切片数据搬运实战:GM↔UB 多维 Tensor 子集搬运原理与样例解析 DataCopy(切片数据搬运)是 Ascen
人工智能深度学习高性能计算CANNAscend C 向量加法算子入门实战:Add 样例的"搬入-计算-搬出"流水实现与多核并行解析(asc-devkit)
Ascend C 向量加法算子入门实战:Add 样例的"搬入 计算 搬出"流水实现与多核并行解析(asc devkit) 本篇文章基于 asc devkit 仓
人工智能深度学习高性能计算CANNAscend C 入门实战:asc-devkit 仓库 Add 向量加法算子样例全解析(搬入-计算-搬出三段式流水)
Ascend C 入门实战:asc devkit 仓库 Add 向量加法算子样例全解析(搬入 计算 搬出三段式流水) 导读 本文以 asc devkit 开源仓
人工智能深度学习高性能计算CANN
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考