开发者
资源
[object Object][object Object]

矩阵向量乘(General Matrix-Vector multiplication),即GEMV,是指Matmul计算中M=1,形状为(1, K)的左矩阵A与形状为(K, N)的右矩阵B进行矩阵乘运算的场景。Matmul支持在Tiling侧与Kernel侧通过配置A矩阵的数据格式为来开启GEMV模式,从而高效处理M=1的计算场景。若在M=1时未开启GEMV模式,Matmul计算则将M方向作为非对齐场景进行处理。GEMV模式相较于非对齐处理方式,搬运数据量更少,性能更好。

以M=1,K=256,N=32,左右矩阵数据类型为half的Matmul为具体示例,说明GEMV模式的Matmul API内部处理过程。

  • GEMV模式

    将A矩阵从A1搬运到A2时,1*256的向量被当作16*16的矩阵进行处理,调用接口一次完成16*16分形大小的矩阵搬运。B矩阵的搬运以及矩阵乘计算跟基础场景相同,如下图所示。

    图 1 GEMV模式M=1的矩阵乘计算示意图[object Object][object Object]

  • 非GEMV模式

    将A矩阵从A1搬运到A2时,1*256的向量被当作非对齐矩阵数据进行处理,将M方向对齐到32字节后进行搬运。调用接口每次搬运16*16分形大小的矩阵,一共搬运K/16=16次,导致搬运数据量增加,性能相较于GEMV模式差,如下图所示。

    图 2 非GEMV模式M=1的矩阵乘计算示意图[object Object][object Object]

[object Object]

形状为(1, K)的A矩阵(M=1,K>1)做矩阵乘计算,即输入A矩阵的数据是向量数据。

[object Object]
  • 在Matmul计算中,若要开启GEMV模式,A矩阵的原始输入形状M必须等于1。

  • GEMV场景下,左矩阵A不支持转置。

  • GEMV场景下,Global Memory上的左矩阵数据需要保证16字节对齐。

  • 计算矩阵向量乘时,左矩阵A和左量化系数矩阵scaleA仅支持内存逻辑位置为TPosition::GM。

[object Object]

完整的算子样例请参考

  • Tiling实现

    调用SetAType接口,设置A矩阵的数据格式为CubeFormat::VECTOR,其它Tiling实现与相同。

    [object Object]
  • Kernel实现

    相较于,GEMV场景在创建Matmul对象时,设置模板参数A_TYPE的数据格式为CubeFormat::VECTOR。

    [object Object]