【问题标题】:How do the leading dimension parameter for submatrices in cblas_dgemm() works?cblas_dgemm() 中子矩阵的前导维度参数如何工作?
【发布时间】:2019-01-03 16:39:16
【问题描述】:

我有三个矩阵 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-command,我需要知道前导维度。对我来说,很明显,在总矩阵 A(或其转置形式)的情况下,我们有:M=5, N=4, lda=4

对于子矩阵 C,我认为我必须放弃 &A[5] 并设置 M=3, N=2, ldc=4

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

【问题讨论】:

    标签: c++ blas cblas


    【解决方案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
    C: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. 第一个维度有多长,M (5, 4, 3 / 4, 2, 2)
    3. 这些列/行有多少,N (4, 2, 2 / 5, 4, 3)
    4. 通过外部矩阵跳转到下一列/行的距离ldx (5, 10, 5)

    【讨论】:

    • 谢谢你的文章!难道不是A: M=5 N=4, LDA=4B:M=4, N=2, LDB=10。但是怎么找到号码ldb=10
    • 我认为前导维度就像指针从一行的第一个元素到下一行的第一个元素必须执行的步骤。
    • 没错。仅当行主要时。以上我所做的都是专栏主要的。大多数图书馆自然而然地做专栏专业。这就是为什么即使在 C/C++ 中我也总是使用以列为主的数据。
    • 啊哈现在我明白了!那么在这种情况下,我将使用CblasColMajor。非常感谢,晚上好
    • 我在博士期间处理过这些东西。我正在研究多维 MRI 数据。 (x,y,z,time,phases, ...) 代码在这里。:github.com/kvahed/codeare 具体的 BLAS/Lapack 代码在这里:github.com/kvahed/codeare/tree/master/src/matrix/linalg
    猜你喜欢
    • 2015-10-02
    • 2017-11-06
    • 2017-03-06
    • 1970-01-01
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多