昇腾社区首页
中文
注册

TransdataOperation

功能

数据格式转换处理。将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};
};

参数列表

成员名称

类型

默认值

描述

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的最后两维。

ND转NZ输入输出描述

参数

维度

数据类型

格式

描述

x

  1. [batch, m, n]
  2. [m, n]

float16/int8

ND

输入tensor。

y

[batch, n1, m1m0, n0]

float16/int8

NZ

输出tensor,数据类型与输入tensor一致

  • 当输入tensor数据类型为float16时,n0, m0为16。
  • 当输入tensor数据类型为int8时,n0为32,m0为16
  • 当输入tensor为2维时,输出tensor的batch为1

NZ转ND输入输出描述

参数

维度

数据类型

格式

描述

x

[batch, n1, m1m0, n0]

float16

NZ

输入tensor。

y

[batch, m, n]

float16

ND

输出tensor,数据类型与输入tensor一致

功能列表

  • 将ACL_FORMAT_ND数据格式的Tensor转换为ACL_FORMAT_FRACTAL_NZ数据格式
    • 数据类型为float16
      • 输入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

      将一个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时,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]的取值范围要求。
  • 不支持原地写。