矩阵-向量的倍数vs.矩阵

matrix-vector multiple vs. dgemm

本文关键字:矩阵 vs 向量      更新时间:2023-10-16

我在我的代码中做了大量的矩阵向量乘法。我发现我的幼稚实现胜过MKL10中的cblas_dgemm。我自己的猜测是,为什么会这样,因为gemm做了*A *B + *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++;
    }
}   

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

你已经说过DGEMM做alpha * A * B + beta * C,所以为什么不也试着写一下,看看它与DGEMM的比较。

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

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