---
title: TransdataOperation
description: "| 硬件型号 | 是否支持 | 特殊说明 |"
url: https://www.hiascend.com/document/detail/zh/canncommercial/latest/API/ascendtb/ascendtb_01_0083.html
sourcePath: /source/zh/canncommercial/900/API/ascendtb/ascendtb_01_0083.html
indexId: fe9cc7e4899c1650006adf93b45ca0630c29c73a7282aa00ed574961de4af88964
---
# TransdataOperation

#### 产品支持情况

| 硬件型号 | 是否支持 | 特殊说明 |
| --- | --- | --- |
| Atlas 350 加速卡 | x | \- |
| Atlas A3 推理系列产品 / Atlas A3 训练系列产品 | √ | \- |
| Atlas A2 训练系列产品 / Atlas A2 推理系列产品 | √ | \- |
| Atlas 训练系列产品 | √ | \- |
| Atlas 推理系列产品 | √ | \- |
| Atlas 200I/500 A2 推理产品 | √ | 仅支持float16数据类型。 |


#### 功能说明

数据格式转换处理。将ACL_FORMAT_ND格式转换为ACL_FORMAT_FRACTAL_NZ格式，或将ACL_FORMAT_FRACTAL_NZ格式转换为ACL_FORMAT_ND格式。

- 等效描述：ND、ACL_FORMAT_ND
- 等效描述：NZ、ACL_FORMAT_FRACTAL_NZ、FRACTAL_NZ


- ACL_FORMAT_ND格式

  - aclFormat中的描述
    ACL_FORMAT_ND = 2：表示支持任意格式，仅Square、Tanh等单输入算子适用。

  - 详细说明
    Format为数据的物理排布格式，定义了解读数据的维度，ND格式表示1D、2D、3D、4D等。

    以4D为例，N：Batch数量、H：Height，特征图高度、W：Width，特征图宽度、C：Channel，特征图通道。

    以2D为例，一般按照行优先的方式存储。

    图1 ACL_FORMAT_ND格式示例图

- ACL_FORMAT_FRACTAL_NZ格式

  - aclFormat中的描述
    ACL_FORMAT_FRACTAL_NZ = 29：内部格式，用户目前无需使用。

  - 详细说明
    FRACTAL_NZ是分形格式（NW1H1H0W0），将整个矩阵分为（H1*W1）个分形，每一个分形内部有（H0*W0）个元素对应每一个N层。

    图2 ACL_FORMAT_FRACTAL_NZ格式示例图

    以上图为例，N=1、W1=4、H1=4。


#### 定义

```
struct TransdataParam {
     enum TransdataType : int { 
         UNDEFINED = 0, 
         FRACTAL_NZ_TO_ND, 
         ND_TO_FRACTAL_NZ 
     };
     TransdataType transdataType = UNDEFINED;
     SVector<int64_t> outCrops = {0, 0};
     uint8_t rsv[8] = {0};
};
```


#### 参数列表

| 成员名称 | 类型 | 默认值 | 描述 |
| --- | --- | --- | --- |
| transdataType | TransdataType | UNDEFINED | 数据格式转换类型，支持FRACTAL\_NZ和ND互相转换。 UNDEFINED：默认。 FRACTAL\_NZ\_TO\_ND：FRACTAL\_NZ转ND。 ND\_TO\_FRACTAL\_NZ：ND转FRACTAL\_NZ。 此默认类型不可用，用户须配置此项参数。 |
| outCrops | SVector<int64\_t> | {0,0} | 仅当FRACTAL\_NZ转ND时使用，表示原ND数据格式Shape的最后两维。 |
| rsv[8] | uint8\_t | {0} | 预留参数。 |


#### ND转NZ输入输出描述

| 参数 | 维度 | 数据类型 | 格式 | 描述 |
| --- | --- | --- | --- | --- |
| x | [batch, m, n] [m, n] | float16/int8/bf16 | ND | 输入tensor。 |
| y | [batch, n1, m1m0, n0] | float16/int8/bf16 | NZ | 输出tensor，数据类型与输入tensor一致。 当输入tensor数据类型为float16/bf16时，n0、m0为16。 当输入tensor数据类型为int8时，n0为32，m0为16。 当输入tensor为2维时，输出tensor的batch为1。 |


#### NZ转ND输入输出描述

| 参数 | 维度 | 数据类型 | 格式 | 描述 |
| --- | --- | --- | --- | --- |
| x | [batch, n1, m1m0, n0] | float16/bf16 | NZ | 输入tensor。 |
| y | [batch, m, n] | float16/bf16 | ND | 输出tensor，数据类型与输入tensor一致。 |


#### 功能列表

- 将ACL_FORMAT_ND数据格式的Tensor转换为ACL_FORMAT_FRACTAL_NZ数据格式

  - 数据类型为float16/bf16

    - 输入tensor维度为2
      将一个shape为[m,n]的tensor作为输入，m0 = n0 = 16。输出tensor的shape为[1,⌈n/n0⌉,⌈m/m0⌉∗m0,n0]。

    - 输入tensor维度为3
      将一个shape为[batch,m,n]的tensor作为输入，m0 = n0 = 16。输出tensor的shape为[batch,⌈n/n0⌉,⌈m/m0⌉∗m0,n0]。

  - 数据类型为int8

    - 输入tensor维度为2
      将一个shape为[m,n]的tensor作为输入，m0 = 16，n0 = 32。输出tensor的shape为[1,⌈n/n0⌉,⌈m/m0⌉∗m0,n0]。

    - 输入tensor维度为3
      将一个shape为[batch,m,n]的tensor作为输入，m0 = 16，n0 = 32。输出tensor的shape为[batch,⌈n/n0⌉,⌈m/m0⌉∗m0,n0]。

- 将ACL_FORMAT_FRACTAL_NZ数据格式的Tensor转换为ACL_FORMAT_ND数据格式

  - 数据类型为float16/bf16
    将一个shape为[b, n1, m1m0, n0]的Tensor作为输入，参数中的outCrops = {m, n}。输出tensor的shape为[b, m, n]，其中m的取值范围为(，]，n的取值范围为(，]。


#### 约束说明

- 使用的NZ的dims约定表示方式：{b, n1, m1m0, n0}，对应的ND的dims是{b, m, n}，其中：b表示batch，如果batch为1，该维度为1，不可省略。如果batch有多个，该维度为所有batch维度合轴的结果。
  m0/n0表示对齐位，float16/bf16时，n0与m0都为16，int8时，n0为32，m0为16，m1m0表示原始ND的m维度经过对齐位向上对齐，n1表示原始ND的n维度经过对齐位向上对齐后，除以n0的商。

  例如原始ND的dims为{8, 100, 30}，则其对应的NZ的dims为{8, 2, 112, 16}。

- outCrops的长度要求是2，其值须满足以下要求：

  - 如果m0m1落在区间(k1× 16, (k1+ 1) × 16]（其中k1为正整数）内，那么该区间即为outCrops[0]的取值范围要求。
  - 如果n0*n1落在区间(k2× 16, (k2+ 1) × 16]（其中k2为正整数）内，那么该区间即为outCrops[1]的取值范围要求。
- 不支持原地写。
