GerV2 算子说明文档

1. 算子概述

GerV2 是一个用于执行特定矩阵运算的算子。它接收三个输入张量 xyA,并产生一个输出张量 z。该算子在深度学习、科学计算等领域中可能用于实现一些基于矩阵的更新或变换操作,例如在某些优化算法中对参数矩阵的更新等场景。

2. 输入输出

输入

  • x:一个一维张量,表示某种向量或系数等,其数据类型可以是 floatfloat16int32int16,格式为 FORMAT_ND,且内存会自动连续化。
  • y:同样是一维张量,与 x 类似,数据类型和格式要求一致。
  • A:一个二维张量,表示一个矩阵,其数据类型和格式要求与 xy 相同。

输出

  • z:一个二维张量,也是矩阵形式,其数据类型、格式等要求与输入一致。它通常是基于输入的 xyA 经过特定计算规则得到的结果,可能用于后续的计算流程中。

3. 属性

  • alpha:一个可选的浮点型属性,默认值为 1.0。它可能在计算过程中作为某种缩放因子或系数参与运算,对输出结果产生影响。

4. 功能实现

形状推导

ger_v2_infer.cpp 文件中,通过 InferShapeGerV2 函数实现了对输出张量 z 的形状推导。它会根据输入 xy 的形状(主要是它们的维度大小)来确定输出 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.cppger_v2.h 文件中,定义了 GerV2 类的模板实现,用于具体的计算逻辑。它通过模板参数 T 支持多种数据类型(如 floathalfint32_tint16_t 等),并根据 tiling 数据中的信息,分块地从全局内存中读取输入数据到局部内存,进行计算后再将结果写回到全局内存中。

计算过程大致如下:

  • 数据拷贝:通过 CopyIn 函数将输入张量 xyA 的相关数据分块拷贝到局部内存中的队列里。
  • 计算:在 Compute 函数中,从队列中取出数据,按照一定的计算规则(例如对 y 进行缩放、与 x 相乘等操作后与 A 相加)得到局部结果。
  • 结果拷贝:通过 CopyOut 函数将计算得到的局部结果拷贝到输出张量 z 的相应位置。

整个计算过程是基于 tiling 数据中的分块信息,逐块进行的,以充分利用硬件资源并提高计算效率。