优化的汇编代码(BLAS)

时间:2013-07-24 22:33:38

标签: optimization assembly blas

因此,通常关于通过汇编代码提高性能的问题的答案是“不要打扰,编译器比你聪明”。我明白了。

但是,我注意到优化的线性代数库(例如ACML)可以在标准编译库的2x到5x范围内实现性能提升。例如,在我的8核机器上,我已经优化矩阵乘法运行速度比库存单线程BLAS实现快30倍,这意味着,在考虑到因使用所有核心而导致的8倍改进后,仍然有4倍仅通过优化改进。

因此,在我看来,优化的汇编代码确实可以产生巨大的差异。我错过了什么吗?

我问,因为如果它不是非常困难的话,我可能倾向于在其他一些代码段上尝试这个。没有什么比这更复杂了,但是如果我可以通过在汇编中编写一些小的内部循环来获得2倍的改进,那么它可能是值得的。

2 个答案:

答案 0 :(得分:3)

矩阵 - 矩阵产品的加速仅部分归因于使用汇编代码。在一个天真的实现中,主要的瓶颈是内存访问。大多数情况下你的CPU会等待进行实际的计算。

首先必须修改矩阵 - 矩阵乘法的算法,以便L2和L1缓存中的数据可以尽可能频繁地重用。这可以在C(或C ++或Fortran或......)中完成。这将导致实现在矩阵大小变得比缓存大时不会崩溃。这也意味着实现可以一直进行计算(CPU寄存器中所需的数据几乎总是在L1缓存中,L1缓存中所需的数据几乎总是在L2缓存中......)。

下一步是优化所有计算完成的热点。这只涉及C代码的几行(在我的GEMM Tutorial只有10行)。汇编代码针对指令流水线,循环展开(用于改进分支预测),预取(用于减少缓存未命中),使用SSE(或AVX)进行优化。

类似的技术可用于其他BLAS Level 3功能。实际上大多数都使用GEMM函数的内部东西(所谓的微内核)。

ulmBLAS benchmarks中,您看到所有BLAS Level 3功能可以实现大致相同的性能。

为了更全面的阅读,我建议你阅读Robert A. van de Geijn和Enrique S. Quintana-Ortí的好文章The Science of Programming Matrix Computations。 而且你也可能想看看BLISulmBLAS所采用和简化的大多数想法。{/ 3>

答案 1 :(得分:2)

优化的汇编代码可以为您带来巨大的速度增益。

我的研究表明,关于“编译器更好”的说法是有偏见的,与现实生活无关。这是一个神话。

只有比较编写良好的HLL程序,编译好的编译器和编写得很好的汇编程序,编译器才会更好。

另一个故事是,没有那么多优秀甚至体面的汇编程序员。 :)