为什么BLAS有一个用于矩阵-矩阵乘法的gemm函数,以及一个用于矩阵-向量乘法的单独的gemv函数呢?难道矩阵-向量乘法不是矩阵-矩阵乘法的特殊情况,其中一个矩阵只有一行/列吗?
从数学上讲,矩阵向量乘法是矩阵乘法的一种特殊情况,但在软件库中实现时并不一定如此。
它们支持不同的选项。例如,gemv
支持对其正在操作的向量进行步进访问,而 gemm
不支持步进矩阵布局。在 C 语言绑定中,gemm
要求您指定所有三个矩阵的存储顺序,而在 gemv
中对于向量参数来说这是没必要的,因为这将没有意义。
除了支持不同的选项外,还可能针对 gemm
执行无法应用于 gemv
的优化族群。如果您知道正在做矩阵向量积,就不希望库浪费时间来弄清楚这是什么情况,然后才切换到针对该情况进行优化的代码路径; 您最好直接调用它。
lda,ldb,ldc
参数,它们是行/列跨度,通过它们你可以像传递向量时的inc
参数一样表达列矩阵。因此它们等效。 - bluss当您优化gemv和gemm时,不同的技术适用:
如果您需要更多详细信息,请告诉我。
我认为它与BLAS层次结构更匹配,具有一级(向量-向量)、二级(矩阵-向量)和三级(矩阵-矩阵)例程。如果你知道它只是一个向量,它可能可以更好地优化。