【发布时间】:2011-08-22 08:37:12
【问题描述】:
我有一个算法可以一遍又一遍地执行线性代数的树步骤,
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 寄存器中。让乘法非常快,有什么想法吗?
【问题讨论】:
-
通常编译器应该为此类算法生成好的代码。你检查过 C 编译器生成的程序集吗?
-
嗨@m0skit0,是的,有人会认为编译器会擅长这种事情,因为它只是一种扫描算法,但我做了一个“手动”实现。首先,我将其与 Intel mkl 提供的实现进行了比较,而 Intel 和其他 BLAS impl 的表现还算不错。我认为在汇编中实现这一点是要走的路,也许从矢量-矢量 mult impl 开始。并从那里开始工作。
-
您使用了哪个编译器以及哪些优化开关处于活动状态?你试过 GCC 吗?
-
@m0skit0 没关系,编译器通常不擅长矢量化代码。
标签: c optimization assembly blas