GerV2 算子说明文档
1. 算子概述
GerV2 是一个用于执行特定矩阵运算的算子。它接收三个输入张量 x、y 和 A,并产生一个输出张量 z。该算子在深度学习、科学计算等领域中可能用于实现一些基于矩阵的更新或变换操作,例如在某些优化算法中对参数矩阵的更新等场景。
2. 输入输出
输入
- x:一个一维张量,表示某种向量或系数等,其数据类型可以是
float、float16、int32或int16,格式为FORMAT_ND,且内存会自动连续化。 - y:同样是一维张量,与
x类似,数据类型和格式要求一致。 - A:一个二维张量,表示一个矩阵,其数据类型和格式要求与
x、y相同。
输出
- z:一个二维张量,也是矩阵形式,其数据类型、格式等要求与输入一致。它通常是基于输入的
x、y和A经过特定计算规则得到的结果,可能用于后续的计算流程中。
3. 属性
- alpha:一个可选的浮点型属性,默认值为
1.0。它可能在计算过程中作为某种缩放因子或系数参与运算,对输出结果产生影响。
4. 功能实现
形状推导
在 ger_v2_infer.cpp 文件中,通过 InferShapeGerV2 函数实现了对输出张量 z 的形状推导。它会根据输入 x 和 y 的形状(主要是它们的维度大小)来确定输出 z 的形状。具体来说,z 的形状由 x 的长度(第一个维度大小)和 y 的长度(第一个维度大小)共同决定,形成一个二维矩阵,其行数等于 x 的长度,列数等于 y 的长度。
Tiling 分发
在 ger_v2_tiling.cpp 文件中,定义了 GerV2TilingFunc 函数来实现 tiling 分发逻辑。它主要考虑了以下几个方面:
- 平台信息获取:通过
GetPlatformInfo函数获取平台相关的参数,如ubSize(统一缓冲区大小)和coreNum(核心数量),这些信息对于后续的 tiling 策略和资源分配很重要。 - 形状和属性信息获取:通过
GetShapeAttrsInfo函数获取输入张量的形状信息以及属性alpha的值,并进行一系列的校验,确保输入的形状和数据类型等符合预期要求。 - Workspace 大小获取:通过
GetWorkspaceSize函数设置 workspace 的大小。 - Tiling 数据计算:基于上述获取到的信息,计算出 tiling 相关的参数,如每个小核负责的行数、大核负责的行数、尾行的数量、一行分为几个 tile、每次计算的数据个数、最后一次计算的数据个数等,并将这些信息存储到
GerV2TilingData结构体中,供后续的 kernel 执行使用。 - Tiling 键设置:根据输入张量的数据类型,设置不同的 tiling 键,以便选择对应的模板进行计算。
Kernel 实现
在 ger_v2.cpp 和 ger_v2.h 文件中,定义了 GerV2 类的模板实现,用于具体的计算逻辑。它通过模板参数 T 支持多种数据类型(如 float、half、int32_t、int16_t 等),并根据 tiling 数据中的信息,分块地从全局内存中读取输入数据到局部内存,进行计算后再将结果写回到全局内存中。
计算过程大致如下:
- 数据拷贝:通过
CopyIn函数将输入张量x、y和A的相关数据分块拷贝到局部内存中的队列里。 - 计算:在
Compute函数中,从队列中取出数据,按照一定的计算规则(例如对y进行缩放、与x相乘等操作后与A相加)得到局部结果。 - 结果拷贝:通过
CopyOut函数将计算得到的局部结果拷贝到输出张量z的相应位置。
整个计算过程是基于 tiling 数据中的分块信息,逐块进行的,以充分利用硬件资源并提高计算效率。