使用说明
接口定义
初始化Linear+resext、Linear+resmul、Linear+residential。构造时需要传入linear输入矩阵、linear权重矩阵、linear输出矩阵、res输入矩阵、linearRes输出矩阵的tensor信息,其中偏置矩阵可以不送,会调用第二个构造函数进行初始化。
- LinearResFWD(const TensorInfo &srcInfo, const TensorInfo &weiInfo, const TensorInfo &dstInfo, const TensorInfo &biasInfo, const TensorInfo &resInfo, const TensorInfo &linearResInfo, float alpha = 1.0f, float beta = 0.0f, float gamma = 1.0f, ResOpsFunction kind = ResOpsFunction::RES_IDENTIAL, int numthreads)->void
- LinearResFWD(const TensorInfo &srcInfo, const TensorInfo &weiInfo, const TensorInfo &dstInfo, const TensorInfo &resInfo, const TensorInfo &linearResInfo, float alpha = 1.0f, float beta = 0.0f, float gamma = 1.0f, ResOpsFunction kind = ResOpsFunction::RES_IDENTIAL, int numthreads)->void
参数名称 |
数据类型 |
描述 |
取值范围 |
|---|---|---|---|
srcInfo |
KDNN::TensorInfo |
src张量信息。 |
{shape,type,layout} |
weiInfo |
KDNN::TensorInfo |
weight张量信息。 |
{shape,type,layout} |
dstInfo |
KDNN::TensorInfo |
dst张量信息。 |
{shape,type,layout} |
biasInfo |
KDNN::TensorInfo |
bias张量信息。 |
{shape,type,layout} |
resInfo |
KDNN::TensorInfo |
res张量信息。 |
{shape,type,layout} |
linearResInfo |
KDNN::TensorInfo |
linear+res输出张量信息。 |
{shape,type,layout} |
alpha |
float |
linear参数。 |
默认1.0 |
beta |
float |
linear参数。 |
默认0.0 |
gamma |
float |
res操作参数。 |
默认1.0(kind为RES_EXT时gamma与res矩阵相乘,其他时候不生效) |
kind |
enum class |
激活函数类型。 |
默认KDNN::ResOpsFunction::RES_IDENTIAL 可选RES_EXT/RES_MU |
numthreads |
int |
线程数。 |
默认0 |
执行算子运算,要传入存放输入的内存地址和输出的内存地址,a、b、c、bias分别是输入矩阵、权重矩阵、输出矩阵及偏置矩阵的内存地址。其中偏置矩阵的地址要根据构造时是否传入bias选择是否传入。
- Run(const void *a, const void *b, void *c, const void *bias, const void *res, void *linearRes, float gamma = 1.0f, int numThreads = 0)->void
- Run(const void *a, const void *b, void *c, const void *res, void *linearRes, float gamma = 1.0f, int numThreads = 0)->void
参数名称 |
数据类型 |
描述 |
取值范围 |
|---|---|---|---|
a |
void * |
输入指针。 |
大小为MxKxtype.GetSize()的指针 |
b |
void * |
权重指针。 |
大小为KxNxtype.GetSize()的指针 |
c |
void * |
输出指针。 |
大小为MxNxtype.GetSize()的指针 |
bias |
void * |
偏置指针。 |
大小为MxNxtype.GetSize()的指针 |
res |
void * |
ops操作的输入指针。 |
|
linearRes |
void * |
linear+res操作结果指针。 |
|
numThreads(可选) |
int |
线程数。 |
默认送0时会使用GetMaxNumThreads返回的最大线程数 |
ValidateInput负责验证Linear+resext、Linear+resmul、Linear+residential输入参数,也分为有bias版本和无bias版本。在算子构造过程中自动触发执行。
- ValidateInput(const TensorInfo &srcInfo, const TensorInfo &weiInfo, const TensorInfo &dstInfo, const TensorInfo &biasInfo, const TensorInfo &resInfo, const TensorInfo &linearResInfo, float alpha = 1.0f, float beta = 0.0f, float gamma = 1.0f, ResOpsFunction kind = ResOpsFunction::RES_IDENTIAL, int numthreads = 0)->KDNN::Status
- ValidateInput(const TensorInfo &srcInfo, const TensorInfo &weiInfo, const TensorInfo &dstInfo, const TensorInfo &resInfo, const TensorInfo &linearResInfo, float alpha = 1.0f, float beta = 0.0f, float gamma = 1.0f, ResOpsFunction kind = ResOpsFunction::RES_IDENTIAL, int numthreads = 0)->KDNN::Status
参数名称 |
数据类型 |
描述 |
取值范围 |
|---|---|---|---|
srcInfo |
KDNN::TensorInfo |
src张量信息。 |
{shape,type,layout} |
weiInfo |
KDNN::TensorInfo |
weight张量信息。 |
{shape,type,layout} |
dstInfo |
KDNN::TensorInfo |
dst张量信息。 |
{shape,type,layout} |
biasInfo |
KDNN::TensorInfo |
bias张量信息。 |
{shape,type,layout} |
resInfo |
KDNN::TensorInfo |
res张量信息。 |
{shape,type,layout} |
linearResInfo |
KDNN::TensorInfo |
linear+res输出张量信息。 |
{shape,type,layout} |
alpha |
float |
linear参数。 |
默认1.0 |
beta |
float |
linear参数。 |
默认0.0 |
gamma |
float |
res操作参数。 |
默认1.0(kind为RES_EXT时gamma与res矩阵相乘,其他时候不生效) |
kind |
enum class |
激活函数类型。 |
默认KDNN::ResOpsFunction::RES_IDENTIAL 可选RES_EXT/RES_MU |
numthreads |
int |
线程数。 |
默认0 |
支持数据类型
- postops支持fp16/fp32/bf16数据类型(TensorInfo对象初始化时需传入Shape、Type、Layout参数,此处列出为Type支持数据类型。)
表4 TensorInfo对象初始化时支持的Type类型 srcInfo
weiInfo
dstInfo
biasInfo
resInfo
linearResInfo
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::F32(fp32)
KDNN::Element::TypeT::F32(fp32)
KDNN::Element::TypeT::F32(fp32)
KDNN::Element::TypeT::F32(fp32)
KDNN::Element::TypeT::BF16(bf16)
KDNN::Element::TypeT::BF16(bf16)
KDNN::Element::TypeT::BF16(bf16)
KDNN::Element::TypeT::BF16(bf16)
KDNN::Element::TypeT::BF16(bf16)
KDNN::Element::TypeT::BF16(bf16)
- 最高支持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
srcInfo
weiInfo
dstInfo
biasInfo
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
使用示例
二维数据类型为FP32 ops为RES_IDENTIAL的linear+ops操作。
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 28 29 30 31 32 33 34 35 | // 示例 // using SizeType = KDNN::SizeType; using Shape = KDNN::Shape; using Type KDNN::Element::TypeT // Tensor初始化 const KDNN::TensorInfo srcTensor= {{3, 2}, KDNN::Element::TypeT::F32, KDNN::Layout::AB}; const KDNN::TensorInfo weiTensor= {{2, 2}, KDNN::Element::TypeT::F32, KDNN::Layout::AB}; const KDNN::TensorInfo dstTensor= {{3, 2}, KDNN::Element::TypeT::F32, KDNN::Layout::AB}; const KDNN::TensorInfo biasTensor = {{3, 2}, KDNN::Element::TypeT::F32, KDNN::Layout::AB}; const KDNN::TensorInfo resTensor = {{3, 2}, KDNN::Element::TypeT::F32, KDNN::Layout::AB}; const KDNN::TensorInfo linearResTensor = {{3, 2}, KDNN::Element::TypeT::F32, KDNN::Layout::AB}; float alpha = 1.0f; float beta = 0.0f; float gamma = 1.0f; KDNN::ResOpsFunction algKind = KDNN::ResOpsFunction::RES_IDENTIAL; int numThreads = 0; SizeType srcSize = srcATensor.GetTotalTensorSize(); SizeType dstSize = weiBTensor.GetTotalTensorSize(); SizeType weiSize = dstCTensor.GetTotalTensorSize(); SizeType biasSize = biasTensor.GetTotalTensorSize(); SizeType resSize = resTensor.GetTotalTensorSize(); SizeType linearResSize = linearResTensor.GetTotalTensorSize(); // 申请存放入参和结果的的内存空间 float * src = malloc(srcSize* sizeof(float)); float * wei = malloc(weiSize* sizeof(float)); float * dst = malloc(dstSize* sizeof(float)); float * bias = malloc(biasSize* sizeof(float)); float * res = malloc(resSize* sizeof(float)); float * linearRes = malloc(linearResSize* sizeof(float)); // 构造算子 KDNN::LinearResFWD linearResFwd(srcTensor, weiTensor, dstTensor, biasTensor, resTensor, linearResTensor, alpha, beta, gamma, algKind, numThreads); // 算子执行 linearResFwd.Run(src, wei, dst, bias, res, linearRes, gamma, numThreads); |