[英]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.