0

我有一个算法可以一遍又一遍地执行线性代数的树步骤,

loop{
  first I multiply a Vector and a Matrix, 
  Second I calculate the sum of elements in the Vector 
  and Thirdly I scale the vector using the sum, making sure the vectors elements scale to one.
}

我正在使用 BLAS 进行操作,这有点快,但它需要对数据进行树运行,每个步骤一个。现在我想知道将这些步骤合并为一个是否会有所收获,只需运行一次数据即可。

有没有人对如何以最佳方式实现这些调用有任何经验,我的矩阵大约是 100*100,向量有 100 个元素。

我认为该向量可以适合 8 个 128 字节 mmx 寄存器。使乘法非常快,有什么想法吗?

4

1 回答 1

5

优化的 BLAS 库是非常棘手的代码,除非您是 asm 编程专家并了解 CPU 的缓存性能,并且愿意花费大量时间测试各种方法,否则您不太可能做得更好。如果你想看看它是如何完成的,你可以下载并查看 GOTO BLAS 的源代码(用 asm 实现,是的)。

我不确定如何对您的代码进行任何实质性优化。我怀疑已经在 N=100 时,矩阵向量乘积的 O(N^2) 将主导运行时间,并且算法中的第二步和第三步相当微不足道。因此,尝试结合所有 3 个步骤看起来并没有那么有用。

我想你可以做的一件小事,除非你已经在做,否则在第三步中乘以总和的倒数,而不是除以总和;除法比乘法昂贵得多。例如


double my_sum = sum(my_vector);
double tmp = 1 / my_sum;
for (i=...) {
   my_vector[i] *= tmp;
}

于 2011-08-22T12:20:49.350 回答