BLAS: gemm vs. gemv



为什么BLAS有一个gemm函数用于矩阵-矩阵乘法和一个单独的gemv函数用于矩阵-向量乘法?矩阵-向量乘法不是矩阵-矩阵乘法的一个特例吗?一个矩阵只有一行/一列?

在数学上,矩阵-向量乘法是矩阵-矩阵乘法的一种特殊情况,但在软件库中实现的它们并不一定是正确的。

它们支持不同的选项。例如,gemv支持对其操作的向量的跨行访问,而gemm不支持跨行矩阵布局。在C语言绑定中,gemm要求您指定所有三个矩阵的存储顺序,而在gemv中,对于vector参数没有必要这样做,因为它将没有意义。

除了支持不同的选项之外,还有一些可能在gemm上执行的优化不适用于gemv。如果你知道你在做一个矩阵-向量乘积,你不希望库在切换到针对这种情况优化的代码路径之前浪费时间弄清楚这种情况;你最好直接调用它

当您优化gemv和gemm时,使用不同的技术:

  • 对于矩阵-矩阵操作,您正在使用阻塞算法。块大小取决于缓存大小。
  • 为了优化矩阵向量积,您使用所谓的融合1级操作(例如融合点积或融合轴)。

我认为它只是适合BLAS层次结构更好的1级(向量-向量),2级(矩阵-向量)和3级(矩阵-矩阵)例程。如果你知道它只是一个矢量,它可能会优化得更好。

相关内容

  • 没有找到相关文章

最新更新