0

我有三个矩阵 A、B 和 C: 在此处输入图像描述

以及一般矩阵的矩阵-矩阵乘积:

void cblas_dgemm(const enum CBLAS_ORDER __Order, const enum CBLAS_TRANSPOSE __TransA, const enum CBLAS_TRANSPOSE __TransB, const int __M, const int __N, const int __K, const double __alpha, const double *__A, const int __lda, const double *__B, const int __ldb, const double __beta, double *__C, const int __ldc);

为了使用- 命令,cblas_dgemm我需要知道前导维度。对我来说很明显,在总矩阵 A (或其转置形式)的情况下,我们有:M=5, N=4, lda=4

在子矩阵 CI 的情况下,我认为我必须放弃&A[5]并设置M=3, N=2, ldc=4

但我不知道这在红色子矩阵 B 的情况下如何工作M=4, N=2。谁可以给我解释一下这个。非常感谢。

4

1 回答 1

1

这篇文章非常准确: https ://petewarden.com/2015/10/25/an-engineers-guide-to-gemm/

BLAS 例程明显复杂的原因是它们具有很大的灵活性,并且经过优化以非常好地执行。如果可以将例程应用于由感兴趣的子矩阵等组成的矩阵,则这两个目标都可以实现。通常,它们可以做的比您需要的更多。xGEMM类就是一个突出的例子。你可以表演A * B,但也A * B + c*C...

在上述情况下:

甲:M=5, N=5, LDA = 5
乙:M=4, N=1, LDB = 10
丙:M=3, N=2, LDB = 5

你是正确的,你在 C 中的第一个条目是&C[6]

换句话说,如果您是列主要的,则前导维度通常是外部矩阵的列上的长度,如果您是计算行主要的,则通常是行的长度。

在情况 B 中,它有点棘手,因为当从子矩阵的一列转到下一列时,您必须跳过两列,每列 5,即 10。

BLAS 现在想要的是(列/行专业):

  1. 从哪里开始(&A[0], &B[0], &C[6]/ &A[0], &B[0], &C[5]
  2. 第一个维度有多长,M5, 4, 3/ 4, 2, 2
  3. 这些列/行中有多少,N4, 2, 2/ 5, 4, 3
  4. 跳过外矩阵多远到达下一列/行ldx( 5, 10, 5)
于 2019-01-03T16:51:58.150 回答