跳到主要内容

数据格式

互推导关系

推导规则

当一个API(如aclnnAdd、aclnnMul等)输入的Tensor数据类型不一致时,API内部会推导出一个数据类型,将输入数据转换成该数据类型进行计算。

类型推导的规则如表1表2所示。

:::note 说明

  • 为方便描述,表格中使用的数据类型是简写形式,代表的含义:ACL_FLOAT(f32)、ACL_FLOAT16(f16)、ACL_DOUBLE(f64)、ACL_BF16(bf16)、ACL_INT8(s8)、ACL_UINT8(u8)、ACL_INT16(s16)、ACL_UINT16(u16)、ACL_INT32(s32)、ACL_UINT32(u32)、ACL_INT64(s64)、ACL_UINT64(u64)、ACL_BOOL(bool)、ACL_COMPLEX32(c32)、ACL_COMPLEX64(c64)、ACL_COMPLEX128(c128)。
  • 表格里表头和最左侧一列分别表示待推导的两个输入数据类型,表格中对应位置表示推导出的数据类型。
  • NA表示这两种类型不能进行推导计算。
  • 当输入数据类型为bool与其他任意数据类型(非u16、u32、u32),其推导出的数据类型为其他任意数据类型。当输入数据类型为bool与u16、u32、u64其中一个,均不支持数据类型推导。
  • 当输入数据类型为u16与u16,其推导出的数据类型仍为u16。当输入数据类型为u16与非u16的任意数据类型,不支持数据类型推导。
  • 当输入数据类型为u32与u32,其推导出的数据类型仍为u32。当输入数据类型为u32与非u32的任意数据类型,不支持数据类型推导。
  • 当输入数据类型为u64与u64,其推导出的数据类型仍为u64。当输入数据类型为u64与非u64的任意数据类型,不支持数据类型推导。 :::

表1 常见数据类型推导关系

数据类型f32f16f64bf16s8u8s16s32s64c32c64c128
f32f32f32f64f32f32f32f32f32f32c64c64c128
f16f32f16f64f32f16f16f16f16f16c32c64c128
f64f64f64f64f64f64f64f64f64f64c64c64c128
bf16f32f64f64bf16bf16bf16bf16bf16bf16c32c64c128
s8f32f16f64bf16s8s16s16s32s64c32c64c128
u8f32f16f64bf16s16u8s16s32s64c32c64c128
s16f32f16f64bf16s16s16s16s32s64c32c64c128
s32f32f16f64bf16s32s32s32s32s64c32c64c128
s64f32f16f64bf16s64s64s64s64s64c32c64c128
c32c64c32c64c32c32c32c32c32c32c32c64c128
c64c64c64c64c64c64c64c64c64c64c64c64c128
c128c128c128c128c128c128c128c128c128c128c128c128c128
数据类型f32f16f64bf16s8u8s16s32s64c32c64c128
u16NANANANANANANANANANANANA
u32NANANANANANANANANANANANA
u64NANANANANANANANANANANANA

推导示例

  • 调用aclnnAdd接口时,如果两个输入参数的数据类型不一致,一个为float16,一个为float32,那么API内部就会将float16的数据类型转换成float32的数据类型然后进行计算。
  • 调用aclnnAdd接口时,如果两个输入参数的数据类型不一致,一个为float32,一个为bool,那么API内部就会将bool的数据类型转换成float32的数据类型然后进行计算。

父主题: 基本概念

互转换关系

当一个API(如aclnnAdd、aclnnMul等)输出的Tensor数据类型输入的数据类型推导后的计算类型不一致时,API内部就会将计算结果转换成输出类型对应的数据类型。

数据类型转换需要满足以下规则,不满足规则的将不能进行转换,调用API时会出现参数校验失败。

  • 浮点数据类型:ACL_FLOAT16、ACL_FLOAT、ACL_DOUBLE、ACL_BF16间可以互相转换。
  • 整型数据类型:ACL_INT8、ACL_UINT8、ACL_INT16、ACL_UINT16、ACL_INT32、ACL_UINT32、ACL_INT64、ACL_UINT64间可以互相转换。
  • 整型数据类型可以往浮点类型转换。
  • 浮点数据类型不可以向整型转换。
  • 非BOOL型不可以往BOOL型转换。
  • 复数类型:ACL_COMPLEX64、ACL_COMPLEX128间可以转换,复数类型不可以和非复数类型互转。

父主题: 基本概念

数据格式

数据格式(format)是用于描述一个多维Tensor的轴的业务语义,表示数据的物理排布格式,定义了解读数据的维度,比如1D、2D、3D、4D、5D等。一般在CNN(Convolutional Neural Network)类的API中需要给出具体的数据排布格式。

:::note 说明

  • 数据格式一般形式为“ACL_FORMAT_X**XXX”,为方便描述,可简写为“X**XXX”。
  • 数据格式中维度含义:N(Batch)表示批量大小、H(Height)表示特征图高度、W(Width)表示特征图宽度、C(Channels)表示特征图通道、D(Depth)表示特征图深度。 :::

常见数据格式

目前大部分算子API都是支持ND数据格式的。例如aclnnAdd接口,均标明支持的数据格式是ND(即多维Tensor的,低维度优先连续排布的规则)。

对于aclnnConvolution,该API要求输入的aclTensor设置具有业务语义的格式,而不是ND格式。此类算子,在计算过程中需要知道Tensor中的业务语义才可以进行对应的计算。例如2D卷积中,需要知道Batch维度、Channel维度、Height维度、Width维度与Tensor维度的对应关系是什么。

当调用aclCreateTensor接口的时候,根据API要求设置Tensor的数据格式,当前支持的数据格式有:

ACL_FORMAT_ND、ACL_FORMAT_NCHW、ACL_FORMAT_NHWC、ACL_FORMAT_HWCN、ACL_FORMAT_NDHWC、ACL_FORMAT_NCDHW、ACL_FORMAT_NC、ACL_FORMAT_NCL。

对于非ND的Tensor,Tensor的维度要求与format表述是一致的。例如:

  • 5D的Tensor:要求为ACL_FORMAT_NCDHW、ACL_FORMAT_NDHWC或者ACL_FORMAT_ND(如果API参数说明中未标明支持ND,设置ND格式后API将会校验报错)。
  • 4D的Tensor:要求为ACL_FORMAT_NCHW、ACL_FORMAT_NHWC、ACL_FORMAT_HWCN或者ACL_FORMAT_ND。
  • 3D的Tensor:要求为ACL_FORMAT_NCL或者ACL_FORMAT_ND。
  • 2D的Tensor:要求为ACL_FORMAT_NC或者ACL_FORMAT_ND。
  • 其他维度的Tensor:要求为ACL_FORMAT_ND。

私有数据格式

除了常见的数据格式,还存在其他的数据格式,比如ACL_FORMAT_NC1HWC0、ACL_FORMAT_FRACTAL_Z、ACL_FORMAT_NC1HWC0_C04、ACL_FORMAT_FRACTAL_NZ、ACL_FORMAT_NDC1HWC0、ACL_FORMAT_FRACTAL_Z_3D等。

这些格式,属于NPU的一些私有格式,当前绝大多数的aclnn API还不支持这些格式。如果有个别API申明了支持的数据格式,请以该API实际描述为准。

父主题: 基本概念

数据结构

常用的数据结构如下,可以通过公共接口创建。

  • 定义AscendCL张量数据结构,用来管理和存储类似向量、矩阵等数据。

    typedef struct aclTensor aclTensor
  • 定义AscendCL标量数据结构,用来管理和存储标量数据(比如一个单独的数)。

    typedef struct aclScalar aclScalar
  • 定义AscendCL整型数组数据结构,用来管理和存储由int类型数据构成的数组。

    typedef struct aclIntArray aclIntArray
  • 定义AscendCL浮点型数组数据结构,用来管理和存储由float类型数据构成的数组。

    typedef struct aclFloatArray aclFloatArray
  • 定义AscendCL布尔型数组数据结构,用来管理和存储由bool类型数据构成的数组。

    typedef struct aclBoolArray aclBoolArray
  • 定义AscendCL张量列表数据结构,用来管理和存储由tensor类型数据构成的列表。

    typedef struct aclTensorList aclTensorList
  • 定义AscendCL执行器数据结构,用来执行算子计算的容器。

    typedef struct aclOpExecutor aclOpExecutor
  • 定义AscendCL流处理数据结构,用来管理和维护一些异步操作的执行顺序。

    typedef void *aclrtStream

父主题: 基本概念

公共接口

本节罗列了单算子API执行接口定义时依赖的一些AscendCL元接口,通过这些元接口可以构建所需的数据结构,如aclTensor、aclScalar、aclIntArray等。

表1 AscendCL meta接口

接口接口定义功能说明参数说明返回值
aclCreateTensoraclTensor *aclCreateTensor(const int64_t *viewDims, uint64_t viewDimsNum, aclDataType dataType, const int64_t *stride, int64_t offset, aclFormat format, const int64_t *storageDims, uint64_t storageDimsNum, void *tensorData)创建aclTensor。- viewDims(输入):view shape的维度值。
- viewDimsNum(输入):view shape的维度数。
- dataType(输入):tensor的数据类型。
- strides(输入):tensor的view的各个维度步长。
- offset(输入):tensor首元素相对于storage的偏移。
- format(输入):tensor的数据排布格式。
- storageDims(输入):tensor的存储的shape的维度值。
- storageDimsNum(输入):tensor的存储的shape的维度数。
- tensorData(输入):tensor在Device侧的存储地址。
成功则返回创建好的aclTensor,否则返回nullptr。
aclDestroyTensoraclnnStatus aclDestroyTensor(const aclTensor *tensor)销毁aclTensor。tensor(输入):需要销毁的tensor指针。返回0表示成功,返回其它值表示失败。
aclCreateScalaraclScalar *aclCreateScalar(void *value, aclDataType dataType)创建aclScalar。- value(输入):Host侧的scalar类型的指针,其指向的值会作为scalar。
- dataType(输入):scalar的数据类型。
成功则返回创建好的aclScalar,否则返回nullptr。
aclDestroyScalaraclnnStatus aclDestroyScalar(const aclScalar *scalar)销毁aclScalar。scalar(输入):需要销毁的scalar。返回0表示成功,返回其它值表示失败。
aclCreateIntArrayaclIntArray *aclCreateIntArray(const int64_t *value, uint64_t size)创建aclIntArray。- value(输入):Host侧的int64_t类型的指针,其指向的值会赋给Array。
- size(输入):整型数组的长度。
成功则返回创建好的aclIntArray,否则返回nullptr。
aclDestroyIntArrayaclnnStatus aclDestroyIntArray(const aclIntArray *array)销毁aclIntArray。array(输入):需要销毁的aclIntArray。返回0表示成功,返回其它值表示失败。
aclCreateFloatArrayaclFloatArray *aclCreateFloatArray(const float *value, uint64_t size)创建aclFloatArray。- value(输入):Host侧的float类型的指针,其指向的值会赋给Array。
- size(输入):浮点型数组的长度。
成功则返回创建好的aclFloatArray,否则返回nullptr。
aclDestroyFloatArrayaclnnStatus aclDestroyFloatArray(const aclFloatArray *array)销毁aclFloatArray。array(输入):需要销毁的aclFloatArray返回0表示成功,返回其它值表示失败。
aclCreateBoolArrayaclBoolArray *aclCreateBoolArray(const bool *value, uint64_t size)创建aclBoolArray。- value(输入): Host侧的bool类型的指针,其指向的值会赋给Array。
- size(输入):布尔型数组的长度。
成功则返回创建好的aclBoolArray,否则返回nullptr。
aclDestroyBoolArrayaclnnStatus aclDestroyBoolArray(const aclBoolArray *array)销毁aclBoolArray。array(输入):需要销毁的aclBoolArray。返回0表示成功,返回其它值表示失败。
aclCreateTensorListaclTensorList *aclCreateTensorList(const aclTensor *const *value, uint64_t size)创建aclTensorList。value(输入): Device侧的aclTensor类型的指针,其指向的值会赋给TensorList。 size(输入):张量列表的长度。成功则返回创建好的aclTensorList,否则返回nullptr。
aclDestroyTensorListaclnnStatus aclDestroyTensorList(const aclTensorList *array)销毁aclTensorList。array(输入):需要销毁的aclTensorList。返回0表示成功,返回其它值表示失败。
aclGetViewShapeaclnnStatus aclGetViewShape(const aclTensor *tensor, int64_t **viewDims, uint64_t *viewDimsNum)获取aclTensor的ViewShape。- tensor(输入):输入的tensor。
- viewDims(输入):返回的viewShape的dim值。
- viewDimsNum(输入):返回的viewShape的dim维度数。
返回0表示成功,返回其它值表示失败。
aclGetViewStridesaclnnStatus aclGetViewStrides(const aclTensor *tensor, int64_t **stridesValue, uint64_t *stridesNum)获取aclTensor的viewStrides。- tensor(输入):输入的tensor。
- stridesValue(输入):返回的viewStrides的值。
- stridesNum(输入):返回的viewStrides的strides值个数。
返回0表示成功,返回其它值表示失败。
aclGetViewOffsetaclnnStatus aclGetViewOffset(const aclTensor *tensor, int64_t *offset)获取aclTensor的viewOffset。- tensor(输入):输入的tensor。
- offset(输入):返回的offset值。
返回0表示成功,返回其它值表示失败。
aclGetFormataclnnStatus aclGetFormat(const aclTensor *tensor, aclFormat *format)获取aclTensor的format。- tensor(输入):输入的tensor。
- format(输入):返回的aclTensor的数据格式。
返回0表示成功,返回其它值表示失败。
aclGetDataTypeaclnnStatus aclGetDataType(const aclTensor *tensor, aclDataType *dataType)获取aclTensor的DataType。- tensor(输入):输入的tensor。
- dataType(输入):返回的aclTensor的数据类型。
返回0表示成功,返回其它值表示失败。
aclGetIntArraySizeaclnnStatus aclGetIntArraySize(const aclIntArray *array, uint64_t *size)获取aclIntArray的大小。- array(输入):输入的aclIntArray。
- size(输入):返回的长度。
返回0表示成功,返回其它值表示失败。
aclGetFloatArraySizeaclnnStatus aclGetFloatArraySize(const aclFloatArray *array, uint64_t *size)获取aclFloatArray的大小。- array(输入):输入的aclFloatArray。
- size(输入):返回的长度。
返回0表示成功,返回其它值表示失败。
aclGetBoolArraySizeaclnnStatus aclGetBoolArraySize(const aclBoolArray *array, uint64_t *size)获取aclBoolArray的大小。- array(输入):输入的aclBoolArray。
- size(输入):返回的长度。
返回0表示成功,返回其它值表示失败。
aclGetTensorListSizeaclnnStatus aclGetTensorListSize(const aclTensorList *tensorList, uint64_t *size)获取aclTensorList的大小。- tensorList(输入):输入的aclTensorList。
- size(输入):返回的长度。
返回0表示成功,返回其它值表示失败。
aclGetStorageShapeaclnnStatus aclGetStorageShape(const aclTensor *tensor, int64_t **storageDims, uint64_t *storageDimsNum)取Tensor在内存上的存储shape。- tensor(输入):输入的tensor对应的地址。
- storageDims(输出):表示获取shape的地址。
- storageDimsNum(输出):表示获取的shape的维度。
返回0表示成功,返回其它值表示失败。

父主题: 单算子API执行

在线提单