使用说明
接口定义
构造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
|
参数名称 |
数据类型 |
描述 |
取值范围 |
|---|---|---|---|
|
srcTensor |
KDNN::TensorInfo |
src张量信息。 |
{shape,type,layout} |
|
weiTensor |
KDNN::TensorInfo |
wei张量信息。 |
{shape,type,layout} |
|
biasTensor(可选) |
KDNN::TensorInfo |
bias张量信息。 |
{shape,type,layout} |
|
dstTensor |
KDNN::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
|
参数名称 |
数据类型 |
描述 |
取值范围 |
|---|---|---|---|
|
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)->KDNN::Status
- ValidateInput(const TensorInfo &srcTensor, const TensorInfo &weiTensor, const TensorInfo &dstTensor, const TensorInfo &biasTensor, int numThreads = 0)->KDNN::Status
|
参数名称 |
数据类型 |
描述 |
取值范围 |
|---|---|---|---|
|
srcTensor |
KDNN::TensorInfo |
src张量信息。 |
{shape,type,layout} |
|
weiTensor |
KDNN::TensorInfo |
wei张量信息。 |
{shape,type,layout} |
|
biasTensor(可选) |
KDNN::TensorInfo |
bias张量信息。 |
{shape,type,layout} |
|
dstTensor |
KDNN::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
KDNN::Element::TypeT::F16(fp16)
KDNN::Element::TypeT::F16(fp16)
KDNN::Element::TypeT::F16(fp16)
KDNN::Element::TypeT::F16(fp16)
KDNN::Element::TypeT::F16(fp16)
KDNN::Element::TypeT::F16(fp16)
KDNN::Element::TypeT::F32(fp32)
KDNN::Element::TypeT::F32(fp32)
KDNN::Element::TypeT::S8(int8)
KDNN::Element::TypeT::S8(int8)
KDNN::Element::TypeT::S32(int32)
KDNN::Element::TypeT::S32(int32)
KDNN::Element::TypeT::F16(fp16)
KDNN::Element::TypeT::S8(int8)
KDNN::Element::TypeT::F16(fp16)
KDNN::Element::TypeT::F32(fp32)
KDNN::Element::TypeT::F32(fp32)
KDNN::Element::TypeT::F32(fp32)
KDNN::Element::TypeT::F32(fp32)
KDNN::Element::TypeT::F32(fp32)
- 最高支持5Dtensor,支持顺序数据排布:a、ab、abc、abcd、abcde。
实际对应KDNN::Layout::A、KDNN::Layout::AB、KDNN::Layout::ABC、KDNN::Layout::ABCD、KDNN::Layout::ABCDE。
|
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的矩阵乘法运算示例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
// layout为AB M N K 分别为 5 5 5 using SizeType = KDNN::SizeType; using Shape = KDNN::Shape; using Type KDNN::Element::TypeT; Shape srcShape(5, 5); Shape weiShape(5, 5); Shape dstShape(5, 5); Shape biasShape(5, 5); // Tensor初始化 const KDNN::TensorInfo srcTensor = {srcShape, Type::F16, KDNN::Layout::AB}; const KDNN::TensorInfo weiTensor = {weiShape, Type::F16, KDNN::Layout::AB}; const KDNN::TensorInfo dstTensor = {dstShape, Type::F16, KDNN::Layout::AB}; const KDNN::TensorInfo biasTensor = {biasShape, Type::F16, KDNN::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()); // 构造算子 KDNN::Gemm gemmLayer(srcTensor, weiTensor, dstTensor, numThreads); // 执行算子 gemmLayer.Run(src, wei, dst, 1, 0, numThreads); |