在汇编中实现矩阵向量乘法

Mar*_*sen 0 c optimization assembly blas

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

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.
}
Run Code Online (Sandbox Code Playgroud)

我正在使用BLAS来执行操作,这有点快,但是需要树形运行数据,每个步骤一个.现在我想知道是否可以通过将步骤合并为一个来获得一些东西,只需将数据运行一次.

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

我认为矢量可以适合8 128byte mmx寄存器.使乘法很快,任何想法?

jan*_*neb 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;
}

  • 我猜他是正确的,如果他假设他可以在组合3个任务时进行优化.你可以在进行矩阵乘法时总结一下.这有两个好处:首先你要保存额外的循环和开销(即增加循环变量),其次:你已经将向量元素加载到缓存中以进行矩阵向量乘法,并且可以重复使用它们进行求和(BTW:如果你想要删除总和步骤,您还可以添加一个额外的矩阵行,仅包含1).但你是对的:N ^ 2将占主导地位,与之相比,增益非常小. (2认同)