我需要频繁使用matrix_vector_mult(),将矩阵与向量相乘,下面是它的实现.
问题:有一个简单的方法,使它显着,至少两倍,更快?
备注:1)矩阵的大小约为300×50.在此期间它不会改变
跑. 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); } }
解决方法
这在理论上是一个很好的编译器本身应该做的事情,但是我用我的系统(g 4.6.3)试了一下,通过手工展开4次乘法(大约每个矩阵18us,而不是每个矩阵34us):
double vectors_dot_prod2(const double *x,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; }
然而,我希望这种微观优化水平的结果在系统之间变化很大.