C/C++中简单快速的矩阵向量乘法

Ser*_*erg 19 c c++ matrix

我需要经常使用matrix_vector_mult()矩阵与向量相乘,下面是它的实现.

问题:是否有一种简单的方法可以使它显着,至少两倍,更快?

备注:1)矩阵的大小约为300x50.它在运行期间不会改变.2)它必须适用于Windows和Linux.

double vectors_dot_prod(const double *x, const double *y, int n)
{
    double res = 0.0;
    int i;
    for (i = 0; i < n; i++)
    {
        res += x[i] * y[i];
    }
    return res;
}

void matrix_vector_mult(const double **mat, const double *vec, double *result, int rows, int cols)
{ // in matrix form: result = mat * vec;
    int i;
    for (i = 0; i < rows; i++)
    {
        result[i] = vectors_dot_prod(mat[i], vec, cols);
    }
}
Run Code Online (Sandbox Code Playgroud)

650*_*502 22

这是后话,在理论上是个好编译器应该自行完成的,但是我做了一个尝试用我的系统(G ++ 4.6.3),并用手展开4次乘法(约每矩阵18us,而不是有大约两倍的速度上一个300x50矩阵每个矩阵34us):

double vectors_dot_prod2(const double *x, const double *y, int n)
{
    double res = 0.0;
    int i = 0;
    for (; i <= n-4; i+=4)
    {
        res += (x[i] * y[i] +
                x[i+1] * y[i+1] +
                x[i+2] * y[i+2] +
                x[i+3] * y[i+3]);
    }
    for (; i < n; i++)
    {
        res += x[i] * y[i];
    }
    return res;
}
Run Code Online (Sandbox Code Playgroud)

然而,我期望这种微观优化水平的结果在系统之间变化很大.

  • @LuchianGrigore:http://ideone.com/JXXtn,似乎也跑得快了两倍 (2认同)

Use*_*ess 5

正如振亚所说,只需使用一个好的 BLAS 或矩阵数学库。

如果由于某种原因您不能这样做,请查看您的编译器是否可以展开和/或矢量化您的循环;确保的cols是在调用点可以帮助双方常数,假设您发布的功能,可用于内联

如果您仍然无法获得所需的加速,您正在考虑手动展开,并使用扩展或内联汇编程序进行矢量化。