我在我的代码中进行了大量的矩阵向量乘法运算。我发现我的天真实现在MKL10中胜过cblas_dgemm。我自己的猜测为什么会出现这种情况是dgemm做alpha * A * B + beta * C而我只做A * B.但天真的实施明显更好(~3倍加速)。有什么想法可能是这种情况吗?
这是matrix-vector-mult实现:
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++;
}
}
答案 0 :(得分:0)
嗯,你已经对代码进行了基准测试。但为什么不尝试以与DGEMM相同的方式进行乘法?
你已经说过DGEMM会做alpha * A * B + beta * C,所以为什么不尝试写这个也看看它与DGEMM的比较。
你可能会发现它和DGEMM一样快(或慢)。你做的操作少得多,这很可能是它更快的原因。
答案 1 :(得分:0)
原始blas例程http://www.netlib.org/blas/dgemm.f包含许多测试beta值的if语句。我想这已经在性能上产生了一些开销。我想知道如果你采用原始的dgemm例程并将其专门用于你正在考虑的情况会发生什么。此外,根据矩阵大小进行比较会很高兴。