BLAS: gemm与gemv的区别

28
为什么BLAS有一个用于矩阵-矩阵乘法的gemm函数,以及一个用于矩阵-向量乘法的单独的gemv函数呢?难道矩阵-向量乘法不是矩阵-矩阵乘法的特殊情况,其中一个矩阵只有一行/列吗?

3
dgemmdgemv:这是针对好奇心的F77双精度版本讨论函数。还想强调一下,即使在f77版本中没有显示出来,这也是一个非常重要(并且经常使用)的特殊情况,可能可以进行特殊优化。 - user786653
同时比较gemm和gemv在向量矩阵乘法中的性能也很有趣。 - constructor
3个回答

17

从数学上讲,矩阵向量乘法是矩阵乘法的一种特殊情况,但在软件库中实现时并不一定如此。

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

除了支持不同的选项外,还可能针对 gemm 执行无法应用于 gemv 的优化族群。如果您知道正在做矩阵向量积,就不希望库浪费时间来弄清楚这是什么情况,然后才切换到针对该情况进行优化的代码路径; 您最好直接调用它。


2
gemm使用lda,ldb,ldc参数,它们是行/列跨度,通过它们你可以像传递向量时的inc参数一样表达列矩阵。因此它们等效。 - bluss

6

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

  • 对于矩阵-矩阵操作,您将使用分块算法。块大小取决于缓存大小。
  • 为了优化矩阵-向量乘积,您使用所谓的融合一级运算(例如融合点积或融合axpy)。

如果您需要更多详细信息,请告诉我。


1
在大多数情况下,可以说gemv()的性能比gemm()更好吗? - constructor
2
是的,对于实际的矩阵-向量乘积,gemv具有更好的性能(假设您不将糟糕的gemv实现与良好的gemm实现进行比较)。 话虽如此,在gemv操作中,您永远无法达到峰值性能。因此,在数值线性代数中的技巧是找到利用矩阵-矩阵乘积的算法变体(称为块算法)。 - Michael Lehn

2

我认为它与BLAS层次结构更匹配,具有一级(向量-向量)、二级(矩阵-向量)和三级(矩阵-矩阵)例程。如果你知道它只是一个向量,它可能可以更好地优化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接