---
title: 随路转换DN2NZ搬运（ISASI）
description: "| 产品 | 是否支持 |"
url: https://www.hiascend.com/document/detail/zh/canncommercial/latest/API/ascendcopapi/atlasascendc_api_07_00129.html
sourcePath: /source/zh/canncommercial/900/API/ascendcopapi/atlasascendc_api_07_00129.html
indexId: 7867f43a6aaa883d4e31b377086ce8fe0cd0926ef5586792944492daf8d5971b77
---
# 随路转换DN2NZ搬运（ISASI）

#### 产品支持情况

| 产品 | 是否支持 |
| --- | --- |
| Atlas 350 加速卡 | √ |
| Atlas A3 训练系列产品 / Atlas A3 推理系列产品 | x |
| Atlas A2 训练系列产品 / Atlas A2 推理系列产品 | x |
| Atlas 200I/500 A2 推理产品 | x |
| Atlas 推理系列产品 AI Core | x |
| Atlas 推理系列产品 Vector Core | x |
| Atlas 训练系列产品 | x |


#### 功能说明

随路格式转换数据搬运，适用于在搬运时进行格式转换。


#### 函数原型

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


#### 参数说明


**表1 模板参数说明**

| 参数名 | 描述 |
| --- | --- |
| T | 源操作数或者目的操作数的数据类型。 |
| enableSmallC0 | SmallC0模式开关：当dValue小于等于4的时候，C0\_SIZE会补齐到4 \* sizeof(T) Bytes，默认不开启。 |


**表2 参数说明**

| 参数名称 | 输入/输出 | 含义 |
| --- | --- | --- |
| dst | 输出 | 目的操作数，类型为LocalTensor。 |
| src | 输入 | 源操作数，类型为GlobalTensor。 |
| intriParams | 输入 | 搬运参数，Dn2NzParams类型，具体参数说明请参考表Dn2NzParams结构体参数定义；具体定义请参考${INSTALL\_DIR}/include/ascendc/basic\_api/interface/kernel\_struct\_data\_copy.h，${INSTALL\_DIR}请替换为CANN软件安装后文件存储路径。 |


**表3 Dn2NzParams结构体参数定义**

| 参数名称 | 含义 |
| --- | --- |
| dnNum | 传输DN矩阵的数目，取值范围：ndNum∈[0, 4095]。 |
| nValue | DN矩阵的行数，取值范围：nValue∈[0, 16384]。 |
| dValue | DN矩阵的列数，取值范围：dValue∈[0, 2^32\-1]。 |
| srcDnMatrixStride | 源操作数相邻DN矩阵起始地址间的偏移，取值范围：srcDNMatrixStride∈[0, 2^64\-1]，单位为元素。 |
| srcDValue | 源操作数同一DN矩阵的相邻行起始地址间的偏移，取值范围：srcDValue∈[1, 2^64\-1]，单位为元素。 |
| dstNzC0Stride | DN转换到NZ格式后，源操作数中的一列会转换为目的操作数的多行。dstNzC0Stride表示，目的NZ矩阵中，来自源操作数同一列的多行数据相邻行起始地址间的偏移，取值范围：dstNzC0Stride∈[1, 65535]，单位：C0\_SIZE（32B）。 |
| dstNzNStride | 目的NZ矩阵中，Z型矩阵相邻行起始地址之间的偏移。取值范围：dstNzNStride∈[1, 65535]，单位：C0\_SIZE（32B）。 |
| dstNzMatrixStride | 目的NZ矩阵中，相邻NZ矩阵起始地址间的偏移，取值范围：dstNzMatrixStride∈[1, 2^32\-1]，单位为元素。 |


DN2NZ转换示意图如下，样例中参数设置值和解释说明如下（以half数据类型为例）：

- dnNum = 2，表示传输DN矩阵的数目为2。
- nValue = 8，DN矩阵的列数，也就是矩阵的宽度为8。
- dValue = 24，DN矩阵的行数，也就是矩阵的高度为24个元素。
- srcDnMatrixStride = 96，表达相邻DN矩阵起始地址间的偏移，即：A1与C1之间的间隔，为6个DataBlock，6 * 16 = 96个元素。
- srcDValue = 48, 表示一行的所含元素个数，即为3个DataBlock, 3 * 16 = 48个元素。
- dstNzC0Stride = 6。DN转换到NZ格式后，源操作数中的一列会转换为目的操作数的多列，例如src中A1和A2为1列，dst中A1和A2被分为2列。多列数据起始地址之间的偏移就是A1和A2在dst中的偏移，偏移为6个datablock。
- dstNzNStride = 2，表达dst中第x个目的DN矩阵和第x+1个目的DN矩阵的起点的偏移，即A1与B1之间的间隔，即为2个DataBlock。
- dstNzMatrixStride = 64，表达dst中第x个目的ND矩阵和第x+1个目的ND矩阵的起点的偏移，即A1和C1之间的距离，即为4个DataBlock，4 * 16 = 64个元素。


#### 通路说明


**表4 数据通路和数据类型**

| 支持型号 | 数据通路（通过TPosition表达） | 源操作数和目的操作数的数据类型 (两者保持一致) |
| --- | --- | --- |
| Atlas 350 加速卡 | GM \-> A1/B1 | int8\_t、uint8\_t、fp4x2\_e2m1\_t、fp4x2\_e1m2\_t、int16\_t、uint16\_t、int32\_t、uint32\_t、half、bfloat16\_t、float |


#### 返回值说明

无


#### 约束说明

无


#### 调用示例

```
// dstLocal: 存放DataCopy的输出Tensor，仅支持A1/B1
// srcGlobal：存放DataCopy的输入Tensor，仅支持GM

AscendC::Dn2NzParams dn2nzParams(
    /* dnNum             */ 1,
    /* nValue            */ 32,
    /* dValue            */ 32,
    /* srcDnMatrixStride */ 0,
    /* srcDValue         */ 32,
    /* dstNzC0Stride     */ 32,
    /* dstNzNStride      */ 1,
    /* dstNzMatrixStride */ 0
);
// 将GM中DN的格式的数据， 按照 dn2nzParams 定义的规则，转换为NZ并拷贝到A1/B1中
AscendC::DataCopy(dstLocal, srcGlobal, dn2nzParams);
```
