news 2026/7/16 22:46:29

CANN/Ascend C ND2NZ数据搬运

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
CANN/Ascend C ND2NZ数据搬运

GMToL1随路转换-ND2NZ搬运(DataCopy)

【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C++标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit

产品支持情况

  • Ascend 950PR/Ascend 950DT:支持
  • Atlas A3 训练系列产品/Atlas A3 推理系列产品:支持
  • Atlas A2 训练系列产品/Atlas A2 推理系列产品:支持
  • Atlas 200I/500 A2 推理产品:不支持
  • Atlas 推理系列产品AI Core:支持
  • Atlas 推理系列产品Vector Core:不支持
  • Atlas 训练系列产品:不支持
  • Kirin X90:支持
  • Kirin 9030:支持

功能说明

头文件路径为:basic_api/kernel_operator_data_copy_intf.h。

该接口主要实现将矩阵从Global Memory搬运至L1 Buffer(TPosition为A1/B1),并支持在数据搬运时进行ND到NZ格式的转换。

ND到NZ的格式转换等价于DN到ZN的格式转换,如图1。

图1ND2NZ与DN2ZN示意图

函数原型

template <typename T> __aicore__ inline void DataCopy(const LocalTensor<T>& dst, const GlobalTensor<T>& src, const Nd2NzParams& intriParams)

特别针对Ascend 950PR/Ascend 950DT,函数原型请参考如下:

template <typename T, bool enableSmallC0 = false> __aicore__ inline void DataCopy(const LocalTensor<T>& dst, const GlobalTensor<T>& src, const Nd2NzParams& intriParams)

参数说明

表1模板参数说明

参数名描述
T源操作数或者目的操作数的数据类型。支持的数据类型请参考数据类型。
enableSmallC0SmallC0模式开关:当dValue小于等于4的时候,C0_SIZE会补齐到4 * sizeof(T)字节。
默认不开启。不同的型号,enableSmallC0支持度不同,请参考enableSmallC0参数支持度说明。

enableSmallC0参数支持度说明

  • 针对Ascend 950PR/Ascend 950DT,新增enableSmallC0参数,调用该接口必须配置参数enableSmallC0;
  • 其他型号不支持该参数。

表2参数说明

参数名称输入/输出含义
dst输出目的操作数,类型为LocalTensor,存储位置为L1 Buffer(TPosition为A1/B1),目的地址需要32字节对齐。
src输入源操作数,类型为GlobalTensor,存储位置为Global Memory,源地址需要1字节对齐。
intriParams输入ND2NZ搬运参数,类型为Nd2NzParams。
Nd2NzParams参数说明请参考表4。

表3Nd2NzParams结构体参数定义

参数名称含义
ndNum源矩阵中ND矩阵的数量,取值范围:ndNum∈[0, 4095]。
注:ndNum = 0表示不执行搬运,该接口将被视为NOP(空操作)。
nValue源矩阵中ND矩阵的行数,取值范围:nValue∈[0, 16384]。
注:nValue = 0表示不执行搬运,该接口将被视为NOP(空操作)。
dValue源矩阵中ND矩阵的列数,取值范围:dValue∈[0, 65535]。当dValue * sizeof(T)不满足32字节对齐时,在目的矩阵中会补0对齐到32字节。
注:dValue = 0表示不执行搬运,该接口将被视为NOP(空操作)。
srcNdMatrixStride源矩阵相邻ND矩阵起始地址间的偏移,取值范围:srcNdMatrixStride∈[0, 65535],单位:元素个数。
• ndNum = 1时,srcNdMatrixStride无意义,设置为0即可。
• ndNum ≠ 1时,当srcNdMatrixStride = 0时,表示重复搬出源矩阵的第一个ND矩阵。
srcDValue源矩阵一行中包含的元素个数,取值范围:srcDValue∈[1, 65535],单位:元素个数。
dstNzC0StrideND转换为NZ格式后,目的NZ矩阵中相邻Z矩阵起始地址的偏移,取值范围:dstNzC0Stride∈[1, 16384],单位:C0_SIZE(32字节)。
dstNzNStride目的矩阵中,NZ矩阵中相邻行起始地址的偏移,取值范围:dstNzNStride∈[1, 16384],单位:C0_SIZE(32字节)。
dstNzMatrixStride目的矩阵中,相邻NZ矩阵起始地址的偏移,取值范围:dstNzMatrixStride∈[0, 16384],单位:元素个数。
• ndNum = 1时,dstNzMatrixStride无意义,设置为0即可。
• ndNum ≠ 1时,当dstNzMatrixStride = 0时,表示目的矩阵中搬入的每个NZ矩阵都会覆盖第一个NZ矩阵。

数据类型

源矩阵和目的矩阵支持的数据类型保持一致。

针对Ascend 950PR/Ascend 950DT,支持的数据类型为:bool、int8_t、uint8_t、fp4x2_e2m1_t、fp4x2_e1m2_t、hifloat8_t、fp8_e5m2_t、fp8_e4m3fn_t、fp8_e8m0_t、int16_t、uint16_t、half、bfloat16_t、int32_t、uint32_t、float、complex32。

针对Atlas A3 训练系列产品/Atlas A3 推理系列产品,支持数据类型为:b4(int4b_t)、int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t、half、bfloat16_t、float。

针对Atlas A2 训练系列产品/Atlas A2 推理系列产品,支持数据类型为:b4(int4b_t)、int8_t、uint8_t、int16_t、uint16_t、int32_t、uint32_t、half、bfloat16_t、float。

针对Atlas 推理系列产品AI Core,支持数据类型为:int16_t、uint16_t、int32_t、uint32_t、half、float。

Kirin X90,支持数据类型为:int8_t、uint8_t、int16_t、uint16_t、half。

Kirin 9030,支持数据类型为:int8_t、uint8_t、int16_t、uint16_t、half。

返回值说明

约束说明

  • 当输入数据类型是b4时,ND2NZ过程中数据是基于b8类型进行处理,因此参数需要根据b8类型进行设置。

  • 位于Global Memory的源地址必须1字节对齐,位于L1 Buffer的目的地址必须32字节对齐。

  • 当Nd2NzParams结构体参数ndNum、nValue、dValue任意一个值为0时,该指令不会执行,该接口将被视为NOP(空操作)。

  • 搬运至L1 Buffer的数据不能重叠,如果存在重叠写入,硬件不会产生任何警告或错误,并且不保证重叠数据的写入顺序。

  • Nd2NzParams结构体参数的值需在取值范围内:

    表4Nd2NzParams结构体参数取值范围

    参数名称取值范围
    ndNum[0, 4095]
    nValue[0, 16384]
    dValue[0, 65535]
    srcNdMatrixStride[0, 65535]
    srcDValue[1, 65535]
    dstNzC0Stride[1, 16384]
    dstNzNStride[1, 16384]
    dstNzMatrixStride[0, 16384]
  • 针对Atlas 推理系列产品AI Core,使用Global Memory -> Local Memory通路的ND2NZ搬运接口时,需要预留8K的UB空间,作为接口的临时数据存放区。

关键特性说明

连续搬运

以half数据类型为例,图2为ND2NZ连续搬运示意图。Nd2NzParams结构体参数配置说明如下:

  • ndNum = 1,表示搬运的ND矩阵的数量为1。
  • nValue = 16,一个ND矩阵的行数。
  • dValue = 23,一个ND矩阵的列数。当dValue * sizeof(T)不满足32字节对齐时,在目的矩阵中会补0对齐到32字节。
  • srcNdMatrixStride = 0,只有一个ND矩阵,该值为0。
  • srcDValue = 32,表示源矩阵一行所含元素个数,即32个half数据类型的元素。
  • dstNzC0Stride = 16,NZ矩阵中相邻Z矩阵起始地址的偏移,偏移为16个C0_SIZE。
  • dstNzNStride = 1,表示NZ矩阵中相邻行起始地址的偏移。
  • dstNzMatrixStride = 0,只有一个NZ矩阵,该值为0。

图2ND2NZ转换示意图(连续搬运)

非连续搬运

以half数据类型为例,图3为ND2NZ非连续搬运示意图。Nd2NzParams结构体参数配置说明如下:

  • ndNum = 2,表示搬运的ND矩阵的数量为2。
  • nValue = 8,一个ND矩阵的行数。
  • dValue = 23,一个ND矩阵的列数。当dValue * sizeof(T)不满足32字节对齐时,在目的矩阵中会补0对齐到32字节。
  • srcNdMatrixStride = 384,表示相邻ND矩阵起始地址的偏移,每行32个元素,共12行,偏移为32 * 12 = 384个元素。
  • srcDValue = 32,表示源矩阵一行所含元素个数,即32个half数据类型的元素。
  • dstNzC0Stride = 37,NZ矩阵中相邻Z矩阵起始地址的偏移,偏移为37个C0_SIZE。
  • dstNzNStride = 2,表示NZ矩阵中相邻行起始地址的偏移。
  • dstNzMatrixStride = 320,相邻NZ矩阵起始地址的偏移,每行16个元素,共20行,偏移为16 * 20 = 320个元素。

图3ND2NZ转换示意图(非连续搬运)

SmallC0模式

enableSmallC0开启模式下的ND2NZ转换示意图如下:

图4enableSmallC0开启模式下的ND2NZ转换示意图(half数据类型)

![](https://raw.gitcode.com/cann/asc-devkit/raw/1cd1d1192e01ae4a8684cd07552c35e13e5c4bdf/docs/zh/api/figures/enableSmallC0开启模式下的ND2NZ转换示意图-(half数据类型).png "enableSmallC0开启模式下的ND2NZ转换示意图-(half数据类型)"?utm_source=gitcode_repo_files)

调用示例

如下示例中:在A矩阵不转置,数据类型为half的场景下,使用DataCopy进行随路ND2NZ数据搬运。

搬运过程的数据排布变化示意图如下:

示例代码片段如下,仅展示样例中的部分代码,完整示例请参考:DataCopy_GM2L1样例。

// m=40,k=56,fractalShape[0] = 16,fractalShape[1] = 16,fractalSize = 16 * fractalShape[1] AscendC::Nd2NzParams nd2nzA1Params; // 传输ND矩阵的数目 nd2nzA1Params.ndNum = 1; // ND矩阵的行数 nd2nzA1Params.nValue = m; // ND矩阵的列数 nd2nzA1Params.dValue = k; // 只传输了1个ND矩阵,该参数无效 nd2nzA1Params.srcNdMatrixStride = 0; // 源矩阵一行中包含的元素个数 nd2nzA1Params.srcDValue = k; // 以下这个参数取A矩阵在L1 Buffer上,高度方向的对齐后的长度 nd2nzA1Params.dstNzC0Stride = CeilAlign(m, fractalShape[0]); nd2nzA1Params.dstNzNStride = 1; nd2nzA1Params.dstNzMatrixStride = 0; AscendC::DataCopy(a1Local, aGM, nd2nzA1Params);

【免费下载链接】asc-devkit本项目是CANN 推出的昇腾AI处理器专用的算子程序开发语言,原生支持C和C++标准规范,主要由类库和语言扩展层构成,提供多层级API,满足多维场景算子开发诉求。项目地址: https://gitcode.com/cann/asc-devkit

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

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/16 22:44:11

FPGA开发避坑指南:从环境搭建到Verilog实战

1. FPGA学习路上的那些坑与经验刚接触FPGA那会儿&#xff0c;我像大多数初学者一样&#xff0c;被各种专业术语和工具链搞得晕头转向。记得第一次用Quartus II编译工程时&#xff0c;ISE卡在90%进度条不动了&#xff0c;我盯着屏幕整整一上午&#xff0c;最后发现是路径中有中文…

作者头像 李华
网站建设 2026/7/16 22:36:24

PCB设计学习指南:从入门到精通的核心技能与学习路径

刚入行的新人&#xff0c;或者准备转行做 PCB 设计的朋友&#xff0c;最常问的一个问题就是&#xff1a;“我要学多少东西才算合格&#xff1f;” 这个问题背后&#xff0c;其实藏着一种焦虑——怕学得不够&#xff0c;也怕学得太多用不上。我见过有人把 Allegro 的每一个菜单都…

作者头像 李华
网站建设 2026/7/16 22:30:14

Ubuntu下Claude Code与Openclaw深度集成实战指南

1. 项目概述&#xff1a;这不是一个“安装教程”&#xff0c;而是一份真实踩坑的手术记录“Claude CodeOpenclaw最强组合从0开始踩坑日记&#xff08;二&#xff09;”——光看标题&#xff0c;你大概率会以为这又是一篇带点营销味的工具链安利文。但我要先说清楚&#xff1a;这…

作者头像 李华
网站建设 2026/7/16 22:29:04

Arduino + 四位LED数码管:从静态驱动到动态扫描的实战解析

1. 四位LED数码管基础认知第一次拿到四位LED数码管时&#xff0c;我盯着那12个引脚有点懵——这玩意儿比单个数码管复杂多了&#xff01;后来发现其实理解它的结构并不难。四位数码管本质上就是四个独立的七段数码管&#xff08;带小数点就是八段&#xff09;共用引脚组成的。想…

作者头像 李华
网站建设 2026/7/16 22:28:32

基于眼球追踪与手势识别的实时ASMR交互系统开发实践

这次我们来看一个有趣的 ASMR 项目&#xff0c;标题虽然有点夸张&#xff0c;但核心是一个基于计算机视觉和音频处理的互动体验。这个项目结合了眼球追踪、手势识别和 ASMR 音频反馈&#xff0c;创造了一种独特的沉浸式交互。从技术角度看&#xff0c;这个项目最值得关注的是它…

作者头像 李华
网站建设 2026/7/16 22:28:04

从零开始玩转iO-808:Web版TR-808鼓机快速上手指南

从零开始玩转iO-808&#xff1a;Web版TR-808鼓机快速上手指南 【免费下载链接】io-808 An attempt at a fully recreated web-based TR-808 drum machine. 项目地址: https://gitcode.com/gh_mirrors/io/io-808 想要体验传奇鼓机TR-808的魅力&#xff0c;却苦于硬件价格…

作者头像 李华