为什么要进行代码加速?

来源:互联网 发布:js 多条件判断 编辑:程序博客网 时间:2024/04/27 20:47

  • 背景
  • 自动优化
  • 总结

转载请注明出处:http://blog.csdn.net/c602273091/article/details/54576165

How to write fast code不是教你如何写代码更快,而是教你如何写更快的代码。

首先我们需要了解为什么需要进行代码加速?要写一些并行的代码进行加速?

背景

这里写图片描述
从这幅图可以了解到吃CPU福利的纯粹代码加速已经不行了,单个CPU加速连续代码已经到了极限,再往上收到CPU功耗等等的制约。与此同时,层次化存储使得CPU和存储器之间的瓶颈也越来越大。所以使得代码发挥出硬件上的效果,需要做加速。做加速在编译器层是很难实现的,因为设计并行比如:流水线、向量操作、多线程、SIMD这些。编译器想要优化的话,需要对源代码进行重构,可惜这是很困难的。所以写高效的代码,适合并行平台,满足存储层次性要求显得非常重要。

如何进行加速呢?在这里提出的是重新写过程序,写符合平台的代码,以达到最高的性能。这里以矩阵乘法和DFT为例子。

这里写图片描述
DFT通过FFT可以使算法复杂度达到O(n log(n)) ,这里有个常用的库就是FFTW【1】, Spiral【2】上图显示的是没有加速、使用存储层次加速、向量运算和多线程之间的速度差别。

这里写图片描述
以上是矩阵乘法的比较,可以发现速度是多线程>向量指令>内存层次>普通。MMM有比较著名的库:ATLAS【3】,Goto BLAS【4】(这两个库在安装caffe的时候应该是选择一个的)

从以上两个例子我们发现不同的算法,使用不同的策略效果会很不一样,所以程序员在优化的时候就很困难。而且面对不同的平台,加速算法需要重构。所以我们经常可以看到软件会发布新版本(有的时候是因为软件的bug,或者是因为运行平台换了,加速算法进行了重构)

自动优化

在这里有两种自动优化的思路:自适应库和源码生成器。

自适应库就是代码在运行时候,使用搜索机制,使得库能够满足内存层次要求。比如:FFTW

源码生成器感觉更像使用暴力破解,尝试不同的组合:blocking, loop unrolling, and instruction ordering等等看哪个更快,那么就是用更快的组合。比如:ATLAS。

总结

1、代码的加速的红利随着CPU的摩尔定律减缓而慢慢终结,要想使代码发挥它的功效,并行是必不可少的了。
2、更少的操作不意味着性能更高,如果cache miss多了的话,性能也会变得很低。想要性能高,应该是让代码需要存储层次、向量计算、多线程。
3、想让代码效率比较高是有非常困难的,有的代码在一个平台表现非常好,但是在另外一个平台可能会非常糟糕。同时优化的时候考虑存储、考虑平台,即使考虑得已经非常的完善,但编译器有可能无法发挥出优化的功效。所以代码加速没有那么简单。

以上关于代码优化的内容会出现在课程中【5】在最新的课程中也加入了GPU、分布式系统的加速。比如:GPU的CUDA、openmp;分布式系统hadhoop等等。

【1】FFTW, http://www.fftw.org
【2】Spiral, http://www.spiral.net
【3】Whaley, R.C., Dongarra, J.: Automatically Tuned Linear Algebra Software (ATLAS). In:Proc. Supercomputing (1998)
【4】Goto, K., van de Geijn, R.: On reducing TLB misses in matrix multiplication, FLAME working note 9. Technical Report TR-2002-55, The University of Texas at Austin, Department of Computer Sciences (November 2002)
【5】How to write fast code.Course 18-645, Electrical and Computer Engineering, Carnegie Mellon University (2008),
http://www.ece.cmu.edu/∼pueschel/teaching/18-645-CMU-spring08/course.html

1 0
原创粉丝点击