繁体   English   中英

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

[英]implementing matrix vector multiplication in assembly

我有一种算法可以反复执行线性代数的树形步骤,

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个128byte mmx寄存器中。 使乘法变得非常快,有什么想法吗?

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

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

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


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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM