---
title: 使用说明
description: "构造Gemm对象，构造时需要传入输入矩阵、权重矩阵、输出矩阵的Tensor信息，其中偏置矩阵可以不输入，会调用第二个构造函数进行初始化。"
url: https://www.hikunpeng.com/document/detail/zh/kunpenghpcs/hpckit/devg/KunpengHPCKit_developer_164.html
sourcePath: /source/zh/kunpenghpcs/hpckit/devg/KunpengHPCKit_developer_164.html
indexId: fafd222b74a7b6e287b311a45d1e4f1404feac2079b36dac06adb12908f0681167
---
# 使用说明

#### 接口定义

构造Gemm对象，构造时需要传入输入矩阵、权重矩阵、输出矩阵的Tensor信息，其中偏置矩阵可以不输入，会调用第二个构造函数进行初始化。

- Gemm(const TensorInfo &srcTensor, const TensorInfo &weiTensor, const TensorInfo &dstTensor, int numThreads = 0)->void
- Gemm(const TensorInfo &srcTensor, const TensorInfo &weiTensor, const TensorInfo &dstTensor,const TensorInfo &biasTensor, int numThreads = 0)->void


**表1 Gemm函数输入参数**

| 参数名称 | 数据类型 | 描述 | 取值范围 |
| --- | --- | --- | --- |
| srcTensor | KuDNN::TensorInfo | src张量信息。 | {shape，type，layout} |
| weiTensor | KuDNN::TensorInfo | wei张量信息。 | {shape，type，layout} |
| biasTensor（可选） | KuDNN::TensorInfo | bias张量信息。 | {shape，type，layout} |
| dstTensor | KuDNN::TensorInfo | dst张量信息。 | {shape，type，layout} |
| alpha（可选） | float | gemm参数。 | 默认1.0f |
| beta（可选） | float | gemm参数。 | 默认0.0f |
| numThreads（可选） | int | 线程数。 | 默认送0时会使用GetMaxNumThreads返回的最大线程数 |


执行算子运算，要传入存放输入的内存地址和输出的内存地址，src、wei、dst、bias分别是输入矩阵、权重矩阵、输出矩阵及偏置矩阵的内存地址。其中偏置矩阵的地址要根据构造时是否传入bias选择是否传入。alpha和beta的值默认为1.0f和0.0f。


- Run(const void *src, const void *wei, void *dst, float alpha = 1.0f, float beta = 0.0f, int numThreads = 0)->void
- Run(const void *src, const void *wei, void *dst, void *bias, float alpha = 1.0f, float beta = 0.0f, int numThreads = 0)->void


**表2 Run函数输入参数**

| 参数名称 | 数据类型 | 描述 | 取值范围 |
| --- | --- | --- | --- |
| src | void \* | src指针。 | 大小为MxKxtype.GetSize()的指针 |
| wei | void \* | wei指针。 | 大小为KxNxtype.GetSize()的指针 |
| dst | void \* | dst指针。 | 大小为MxNxtype.GetSize()的指针 |
| bias | void \* | bias指针。 | 大小为MxNxtype.GetSize()的指针 |
| numThreads（可选） | int | 线程数。 | 默认送0时会使用GetMaxNumThreads返回的最大线程数 |


ValidateInput负责验证Gemm输入参数，并在算子构造过程中自动触发执行。

- ValidateInput(const TensorInfo &srcTensor, const TensorInfo &weiTensor, const TensorInfo &dstTensor, int numThreads = 0)->KuDNN::Status
- ValidateInput(const TensorInfo &srcTensor, const TensorInfo &weiTensor, const TensorInfo &dstTensor, const TensorInfo &biasTensor, int numThreads = 0)->KuDNN::Status


**表3 ValidateInput输入参数列表**

| 参数名称 | 数据类型 | 描述 | 取值范围 |
| --- | --- | --- | --- |
| srcTensor | KuDNN::TensorInfo | src张量信息。 | {shape，type，layout} |
| weiTensor | KuDNN::TensorInfo | wei张量信息。 | {shape，type，layout} |
| biasTensor（可选） | KuDNN::TensorInfo | bias张量信息。 | {shape，type，layout} |
| dstTensor | KuDNN::TensorInfo | dst张量信息。 | {shape，type，layout} |
| alpha（可选） | float | gemm参数。 | 默认1.0f |
| beta（可选） | float | gemm参数。 | 默认0.0f |
| numThreads（可选） | int | 线程数。 | 默认送0时会使用GetMaxNumThreads返回的最大线程数 |


#### 支持数据类型

- 矩阵计算数据支持以下数据类型组合。（TensorInfo对象初始化时需传入Shape、Type、Layout参数，此处列出为Type支持数据类型。）
**表4 TensorInfo对象初始化时支持的Type类型**

| srcTensor | weiTensor | dstTensor | biasTensor |
| --- | --- | --- | --- |
| KuDNN::Element::TypeT::F16(fp16) | KuDNN::Element::TypeT::F16(fp16) | KuDNN::Element::TypeT::F16(fp16) | KuDNN::Element::TypeT::F16(fp16) |
| KuDNN::Element::TypeT::F16(fp16) | KuDNN::Element::TypeT::F16(fp16) | KuDNN::Element::TypeT::F32(fp32) | KuDNN::Element::TypeT::F32(fp32) |
| KuDNN::Element::TypeT::S8(int8) | KuDNN::Element::TypeT::S8(int8) | KuDNN::Element::TypeT::S32(int32) | KuDNN::Element::TypeT::S32(int32) |
| KuDNN::Element::TypeT::F16(fp16) | KuDNN::Element::TypeT::S8(int8) | KuDNN::Element::TypeT::F16(fp16) | KuDNN::Element::TypeT::F32(fp32) |
| KuDNN::Element::TypeT::F32(fp32) | KuDNN::Element::TypeT::F32(fp32) | KuDNN::Element::TypeT::F32(fp32) | KuDNN::Element::TypeT::F32(fp32) |


- 最高支持5Dtensor，支持顺序数据排布：a、ab、abc、abcd、abcde。
  实际对应KuDNN::Layout::A、KuDNN::Layout::AB、KuDNN::Layout::ABC、KuDNN::Layout::ABCD、KuDNN::Layout::ABCDE。


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

| dimension | srcTensor | weiTensor | dstTensor | biasTensor |
| --- | --- | --- | --- | --- |
| 2D | ab/ba | ab/ba | ab/ba | ab/ba |
| 3D | abc/acb | abc/acb | abc/acb | abc/acb |
| 4D | abcd/abdc | abcd/abdc | abcd/abdc | abcd/abdc |
| 5D | abcde/abced | abcde/abced | abcde/abced | abcde/abced |


#### 使用示例

二维数据类型均为fp16的矩阵乘法运算示例。

```
// layout为AB M N K 分别为 5 5 5
using SizeType = KuDNN::SizeType;
using Shape = KuDNN::Shape;
using Type KuDNN::Element::TypeT;
Shape srcShape(5, 5);
Shape weiShape(5, 5);
Shape dstShape(5, 5);
Shape biasShape(5, 5);
// Tensor初始化
const KuDNN::TensorInfo srcTensor = {srcShape, Type::F16, KuDNN::Layout::AB};
const KuDNN::TensorInfo weiTensor = {weiShape, Type::F16, KuDNN::Layout::AB};
const KuDNN::TensorInfo dstTensor = {dstShape, Type::F16, KuDNN::Layout::AB};
const KuDNN::TensorInfo biasTensor = {biasShape, Type::F16, KuDNN::Layout::AB};
SizeType srcSize = 5 * 5;
SizeType dstSize = 5 * 5;
SizeType weiSize = 5 * 5;
SizeType biasSize =5 * 5;
// 申请存放入参和结果的内存空间
void * src = malloc(srcSize * Type::F16.GetSize());
void * wei = malloc(weiSize * Type::F16.GetSize());
void * dst = malloc(dstSize * Type::F16.GetSize());
void * ref = malloc(dstSize * Type::F16.GetSize());
// 构造算子
KuDNN::Gemm gemmLayer(srcTensor,
weiTensor, dstTensor, numThreads);
// 执行算子
gemmLayer.Run(src, wei, dst, 1, 0, numThreads);
```
