【发布时间】:2012-08-30 15:11:46
【问题描述】:
我需要经常使用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);
}
}
【问题讨论】:
-
我相信有专门为做点积而设计的 SIMD 指令,但我可能弄错了。
-
@SeanBright,点积确实是瓶颈
-
通常情况下,很难击败优化的
BLAS实现,而dgemv似乎正是您要寻找的东西 -
如果您不想通过使用优化库或手动编码的 SSE/AVX 指令来更改代码,那么编译器开关和 pragma 可以帮助您调整代码。也许
Table 4: Compiler Hints for Intra-Register Vectorization会有所帮助 - software.intel.com/en-us/articles/… -
您可以尝试通过同时计算多个结果来使用多个 CPU。