0

我在我的代码中做了大量的矩阵向量乘法。我发现我的幼稚实现在 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++;
    }
}   
4

2 回答 2

0

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

于 2011-08-31T14:25:58.063 回答
0

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

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

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

于 2011-04-09T02:06:41.053 回答