鲲鹏社区首页
中文
注册
开发者
我要评分
获取效率
正确性
完整性
易理解
在线提单
论坛求助

使用说明

接口定义

构造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

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
表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)->KDNN::Status
  • ValidateInput(const TensorInfo &srcTensor, const TensorInfo &weiTensor, const TensorInfo &dstTensor, const TensorInfo &biasTensor, int numThreads = 0)->KDNN::Status
表3 ValidateInput输入参数列表

参数名称

数据类型

描述

取值范围

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。

表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的矩阵乘法运算示例。

 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);