cblas_dgemm() 中子矩阵的前导维度参数如何工作?
How do the leading dimension parameter for submatrices in cblas_dgemm() works?
我有三个矩阵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
。
在子矩阵 C 的情况下,我想我必须放弃 &A[5]
并设置 M=3, N=2, ldc=4
但我不知道这在 M=4, N=2
的红色子矩阵 B 的情况下如何工作。谁可以给我解释一下这个。非常感谢。
这篇文章非常准确:
https://petewarden.com/2015/10/25/an-engineers-guide-to-gemm/
BLAS 例程明显复杂的原因是它们具有很大的灵活性并且经过优化以表现得非常好。如果这些例程可以应用于由感兴趣的子矩阵等组成的矩阵,那么这两个目标都可以实现。通常它们可以做的比你需要的更多。 xGEMM
class 就是一个突出的例子。您可以执行 A * B
,但也可以执行 A * B + c*C
...
在你上面的情况下:
答:M=5, N=5, LDA = 5
乙:M=4, N=1, LDB = 10
C: M=3, N=2, LDB = 5
你是正确的,你在 C 中的第一个条目是 &C[6]
换句话说,如果您是列优先,则前导维度通常是外部矩阵列的长度;如果您计算行优先,则通常是行的长度。
在情况 B 中,它有点棘手,因为当从子矩阵的一列转到下一列时,您必须跳过两列,每列 5,即 10。
BLAS 现在想要的是(column/row 专业):
- 从哪里开始 (
&A[0], &B[0], &C[6]
/&A[0], &B[0], &C[5]
)
- 第一个维度有多长,
M
(5, 4, 3
/ 4, 2, 2
)
- 有多少个columns/rows,
N
(4, 2, 2
/ 5, 4, 3
)
- 通过外矩阵跳多远才能到达下一个column/row
ldx
(5, 10, 5
)
我有三个矩阵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
。
在子矩阵 C 的情况下,我想我必须放弃 &A[5]
并设置 M=3, N=2, ldc=4
但我不知道这在 M=4, N=2
的红色子矩阵 B 的情况下如何工作。谁可以给我解释一下这个。非常感谢。
这篇文章非常准确: https://petewarden.com/2015/10/25/an-engineers-guide-to-gemm/
BLAS 例程明显复杂的原因是它们具有很大的灵活性并且经过优化以表现得非常好。如果这些例程可以应用于由感兴趣的子矩阵等组成的矩阵,那么这两个目标都可以实现。通常它们可以做的比你需要的更多。 xGEMM
class 就是一个突出的例子。您可以执行 A * B
,但也可以执行 A * B + c*C
...
在你上面的情况下:
答:M=5, N=5, LDA = 5
乙:M=4, N=1, LDB = 10
C: M=3, N=2, LDB = 5
你是正确的,你在 C 中的第一个条目是 &C[6]
换句话说,如果您是列优先,则前导维度通常是外部矩阵列的长度;如果您计算行优先,则通常是行的长度。
在情况 B 中,它有点棘手,因为当从子矩阵的一列转到下一列时,您必须跳过两列,每列 5,即 10。
BLAS 现在想要的是(column/row 专业):
- 从哪里开始 (
&A[0], &B[0], &C[6]
/&A[0], &B[0], &C[5]
) - 第一个维度有多长,
M
(5, 4, 3
/4, 2, 2
) - 有多少个columns/rows,
N
(4, 2, 2
/5, 4, 3
) - 通过外矩阵跳多远才能到达下一个column/row
ldx
(5, 10, 5
)