矩阵-向量的倍数vs.矩阵
matrix-vector multiple vs. dgemm
我在我的代码中做了大量的矩阵向量乘法。我发现我的幼稚实现胜过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程序并将其专门用于你正在考虑的情况会发生什么。此外,如果能看到基于矩阵大小的比较就更好了。
相关文章:
- 在执行其他功能的同时播放动画(LED矩阵和Arduino/ESP8266)
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 使用std::vector的OpenCL矩阵乘法
- 使用C++中的模板和运算符重载执行矩阵运算
- Eigen如何在容器循环中干净地附加矩阵
- 当在带有Eigen的C++中使用GDB时,我如何才能看到更多的大矩阵
- 具有N列和N行的矩阵,列必须具有N-1、N-2等值
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 如何为模板化对象创建模板向量?VS正在投掷C3203
- GCC本机矩阵运算库
- 矩阵向量乘法(cublasDgemv)返回零
- 数据成员SFINAE的C++17测试:gcc vs clang
- 以螺旋方式打印矩阵的程序.(工作不好)
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- OpenCV C++.快速计算混淆矩阵
- Eigen vs Matlab:并行矩阵乘法
- 4x4矩阵乘法前vs乘法后
- openCV vs matlab矩阵连接
- 复数矩阵乘法特征vs Matlab
- 矩阵-向量的倍数vs.矩阵