首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >优化汇编代码(BLAS)

优化汇编代码(BLAS)
EN

Stack Overflow用户
提问于 2013-07-25 06:33:38
回答 2查看 670关注 0票数 4

因此,关于通过汇编代码提高性能的问题的答案通常是这样的:“别费心了,编译器比你聪明”。我明白了。

但是,我注意到优化的线性代数库(例如ACML)可以实现比标准编译库提高2到5倍的性能。例如,在我的8核机器上,优化矩阵乘法的运行速度比普通的单线程BLAS实现快了30倍以上,这意味着,在考虑到由于使用所有内核而提高了8倍之后,仅仅通过优化仍然可以提高4倍。

所以在我看来,优化的汇编代码真的可以产生巨大的不同。我是不是遗漏了什么?

我之所以这样问,是因为如果这不是特别困难,我可能倾向于在其他代码段上尝试这种方法。没有什么复杂的,但是如果我可以通过用汇编编写一些小的内部循环来获得2倍的性能改进,这可能是值得的。

EN

回答 2

Stack Overflow用户

发布于 2014-12-01 18:48:08

矩阵-矩阵乘积的加速只是部分由于使用了汇编代码。在一个简单的实现中,主要的瓶颈是内存访问。大多数情况下,您的CPU将等待进行实际计算。

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

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

类似的技术可以用于其他BLAS级别3功能。实际上,它们中的大多数都使用GEMM函数的内部内容(所谓的微内核)。

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

如果想要更透彻地阅读,我建议你阅读罗伯特·范德盖恩和恩里克·S·昆塔纳-奥蒂写的漂亮的论文The Science of Programming Matrix Computations。你可能还想看看BLIS,在那里大多数的想法都被ulmBLAS采用和简化了。

票数 4
EN

Stack Overflow用户

发布于 2013-07-25 12:41:49

优化的汇编代码可以给你带来巨大的速度提升。

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

只有当你比较写得很好的HLL程序,用真正好的编译器编译的HLL程序和写得很差的汇编程序时,编译器才会更好。

没有那么多优秀甚至正派的汇编语言程序员,这是另一回事。:)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17845972

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档