---
title: 使用说明
description: "初始化GroupNormalizationLayerFWD。构造时需要传入输入矩阵、缩放矩阵、组大小、输出矩阵的tensor信息以及归一化的flag。"
url: https://www.hikunpeng.com/document/detail/zh/kunpenghpcs/hpckit/devg/KunpengHPCKit_developer_179.html
sourcePath: /source/zh/kunpenghpcs/hpckit/devg/KunpengHPCKit_developer_179.html
indexId: f4f3fce1eb29ac91e4a7664c7a1edc1480c8b564f861d02596573348abe0eb2067
---
# 使用说明

#### 接口定义

初始化GroupNormalizationLayerFWD。构造时需要传入输入矩阵、缩放矩阵、组大小、输出矩阵的tensor信息以及归一化的flag。

GroupNormalizationLayerFWD(const TensorInfo &srcInfo, const TensorInfo &scaleShiftInfo, SizeType groupSize, const TensorInfo &dstInfo, NormalizationFlags flags)->void
**表1 GroupNormalizationLayerFWD函数输入参数**

| 参数名称 | 数据类型 | 描述 | 取值范围 |
| --- | --- | --- | --- |
| srcInfo | KuDNN::TensorInfo | 输入矩阵信息。 | {shape{A, ... , D}, type, layout} |
| scaleShiftInfo | KuDNN::TensorInfo | 缩放和偏移矩阵的信息。 | {shape{D}, type, layout} |
| groupSize | KuDNN::SizeType | 组大小。 | 无符号整型，在第二维度上分组的个数 |
| dstInfo | KuDNN::TensorInfo | 输出矩阵信息。 | {shape{A, ... , D}, type, layout} |
| flags | KuDNN::NormalizationFlags | 枚举类，用于选择归一化方式。 | 默认NONE，可选： USE\_GLOBAL\_STATS使用传入的mean和var来计算。 USE\_SCALE对归一化结果再缩放。 USE\_SHIFT对归一化结果再偏移。 |


假设输入数据形状为{A，B，C}则在B维度上进行分组归一化，缩放和偏移操作也在B维度上进行。


执行算子运算。src和dst分别为输入和输出的指针，scale和shift为缩放和偏移，mean和variance为均值和方差的指针，saveStats表示是否保存计算的均值和方差。eps用于避免除0异常。

Run(const void *src, void *dst, const void *scale, const void *shift, float *mean, float *variance, bool saveStats, const float eps)->void
**表2 Run函数输入参数**

| 参数名称 | 数据类型 | 描述 | 取值范围 |
| --- | --- | --- | --- |
| src | void\* | 输入指针。 | \- |
| dst | void\* | 输出指针。 | \- |
| scale | void\* | 缩放指针。 | \- |
| shift | void\* | 偏移指针。 | \- |
| mean | float\* | 均值指针。 | \- |
| variance | float\* | 方差指针。 | \- |
| saveStats | bool | 是否保存计算均值和方差。 | 布尔值 |
| eps | float | 避免除0异常。 | 浮点数 |


验证GroupNormalizationLayerFWD的输入参数，并在算子构造过程中自动触发执行。

ValidateInput(const TensorInfo &srcInfo, const TensorInfo &scaleshiftInfo, SizeType groupInfo,const TensorInfo &dstInfo, NormalizationFlags flags)->KuDNN::Status
**表3 ValidateInput输入参数**

| 参数名称 | 数据类型 | 描述 | 取值范围 |
| --- | --- | --- | --- |
| srcInfo | KuDNN::TensorInfo | src张量信息。 | {shape{A, ... , D}, type, layout} |
| scaleshiftInfo | KuDNN::TensorInfo | scale张量信息。 | {shape{D}, type, layout} |
| groupSize | KuDNN::SizeType | 分组信息。 | 无符号整型，在第二维度上分组的个数 |
| dstInfo | KuDNN::TensorInfo | dst张量信息。 | {shape{A, ... , D}, type, layout} |
| flags | KuDNN::NormalizationFlags | 枚举类，用于选择归一化方式。 | 无符号整型 |


#### 支持数据类型

TensorInfo对象初始化时需传入Shape、Type、Layout参数，此处列出为Type支持数据类型。

- GroupNormalizationLayerFWD支持fp16/fp32数据类型，以下是各个tensor初始化时可用的type类型。
**表4 TensorInfo对象初始化时支持的Type类型**

| srcInfo | scaleShiftInfo | dstInfo |
| --- | --- | --- |
| KuDNN::Element::Type::F16(fp16) | KuDNN::Element::Type::F16(fp16) | KuDNN::Element::Type::F16(fp16) |
| KuDNN::Element::Type::F32(float) | KuDNN::Element::Type::F32(float) | KuDNN::Element::Type::F32(float) |


- 最高支持3D到5D 的tensor，支持顺序数据排布：abc、abcd、abcde。
  对应KuDNN::Layout::ABC、KuDNN::Layout::ABCD、KuDNN::Layout::ABCDE。

**表5 TensorInfo对象初始化时支持的Layout类型**

| dimension | srcInfo数据排布 | dstInfo数据排布 |
| --- | --- | --- |
| 3D | abc | abc |
| 4D | abcd | abcd |
| 5D | abcde | abcde |


#### 使用示例

使用fp16数据类型组归一化，srcInfo数据排布为KuDNN::Layout::ABCD，scaleShiftInfo数据排布为KuDNN::Layout::A，dstInfo数据排布KuDNN::Layout::ABCD。

```
using SizeType = KuDNN::SizeType;
using Shape = KuDNN::Shape;
using Type KuDNN::Element::TypeT
Shape shape(4, 128, 18, 320);
SizeType groupInfo = 2;
//定义张量信息
TensorInfo srcInfo = {shape, Type::F16, KuDNN::Layout::ABCD};
TensorInfo scaleShiftInfo = {{shape[1]}, Type::F16, KuDNN::Layout::A};
TensorInfo dstInfo = {shape, Type::F16, KuDNN::Layout::ABCD};
KuDNN::NormalizationFlags flags = KuDNN::NormalizationFlags::NONE;
// 构造算子KuDNN::GroupNormalizationLayerFWD gnormLayer(srcInfo, scaleShiftInfo, groupInfo, dstInfo,
flags);
// 初始化矩阵数据
SizeType srcSize = srcInfo.GetTotalTensorSize();
SizeType dstSize = dstInfo.GetTotalTensorSize();
SizeType statSize = srcInfo.GetDims()[0] * groupInfo;
SizeType scaleSize = scaleShiftInfo.GetTotalTensorSize();
__fp16 *src = (__fp16*)malloc(srcSize * sizeof(__fp16));
__fp16 *dst = (__fp16*)malloc(srcSize * sizeof(__fp16));
__fp16 *dstRef = (__fp16*)malloc(srcSize * sizeof(__fp16));
float *mean = (float *)malloc(statSize * sizeof(float));
float *variance = (float *)malloc(statSize * sizeof(float));
__fp16 *scale = (__fp16*)malloc(scaleSize * sizeof(__fp16));
__fp16 *shift = (__fp16*)malloc(scaleSize * sizeof(__fp16));
float eps = 1e-5;
// 执行算子
gnormLayer.Run(src, dst, scale, shift, mean, variance, true, eps);
```
