【问题标题】:matrix-vector multiple vs. dgemm矩阵向量倍数与 dgemm
【发布时间】:2011-04-09 02:04:09
【问题描述】:

我在我的代码中进行了大量的矩阵向量乘法运算。我发现我的幼稚实现在 MKL10 中击败了 cblas_dgemm。我自己猜测为什么会出现这种情况是 dgemm 执行 alpha*A *B + beta *C 而我只执行 A*B。但是幼稚的实现要好得多(约 3 倍加速)。有什么想法为什么会出现这种情况?

这是矩阵向量乘法的实现:

void mat_vec_mul(double *a, double *b, double *c, int m, int k)
{

    for (int ii = 0; ii < m; ii++){
        for (int kk = 0; kk < k; kk++){
            *c += *(a+ii*k+kk) * *(b+ii);       

        }
        c++;
    }
}   

【问题讨论】:

  • 哇!警告:检测到可怕的缓冲区溢出和其他不安全因素!
  • 矩阵的大小是多少?您能否也提供用于您的基准测试的确切代码,因为一个不恰当的换位可能意味着很多。

标签: c++ matrix-multiplication intel-mkl


【解决方案1】:

嗯,您已经对代码进行了基准测试。但是为什么不尝试用与 DGEMM 相同的方式进行乘法呢?

您已经说过 DGEMM 可以执行 alpha * A * B + beta * C,那么为什么不也尝试编写它,看看它与 DGEMM 的比较。

您可能会发现它与 DGEMM 一样快(或更慢)。你做的操作少了很多,这很可能是它更快的原因。

【讨论】:

  • 当 dgemm 被调用时,“beta”总是设置为 0。所以如果我要实现 alpha * A * B + beta * C,我会检查 beta 是否为 ~0,所以我基本上是在做 alpha * A * B 而不需要额外的操作。
【解决方案2】:

原始的 blas 例程 http://www.netlib.org/blas/dgemm.f 包含许多用于测试 beta 值的 if 语句。我想这已经在性能上产生了一些开销。我想知道如果您采用原始的 dgemm 例程并将其专门用于您正在考虑的情况会发生什么。此外,很高兴看到根据矩阵大小进行比较。

【讨论】:

    猜你喜欢
    • 2015-04-23
    • 2013-12-28
    • 1970-01-01
    • 1970-01-01
    • 2021-12-04
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 2011-08-06
    相关资源
    最近更新 更多