c - 在汇编中实现矩阵 vector 乘法

标签 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.
}

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

有没有人知道如何以最佳方式实现这些调用,我的矩阵大约是 100*100, vector 有 100 个元素。

我认为 vector 可以放入 8 128 字节的 mmx 寄存器中。让乘法变得非常快,有什么想法吗?

最佳答案

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

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

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


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

关于c - 在汇编中实现矩阵 vector 乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7144887/

相关文章:

c++ - 函数调用时出现 C 到 C++ 错误

assembly - 开始学习汇编的好地方是什么?

c - 将简单的字符标记放置在阵列板上以实现简单的糖果粉碎游戏

.net - 如何将 .NET 应用程序优化为 64 位?

javascript - 如何做 Redis 树并优化它 + Node.js

c++ - 优化条件的方法 "if (m == 0 || n == 0)"

linux - printf 上的段错误 - NASM 64 位 Linux

C型双关题

python - 如何定义一个 C 结构体,其中包含 Ctype python 中的结构体

c - 为什么 `void func(int A[const 10])` 使数组参数成为 const 而不是数组元素?