为什么要进行代码加速?
来源:互联网 发布: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
- 为什么要进行代码加速?
- 网站为什么要采用CDN进行加速
- 为什么要把代码进行分离
- 为什么要选择cdn加速
- 为什么进行不了代码Review?
- 为什么要进行单元测试
- 为什么要进行单元测试?
- 为什么要进行傅里叶变换
- 为什么要进行傅里叶变换
- xgboost进行GPU加速
- 为什么要进行CGI编程?
- 为什么要进行需求管理?
- 为什么要进行项目管理
- 为什么要进行傅立叶变换
- 为什么要进行傅立叶变换
- 为什么要进行傅立叶变换
- 为什么要进行傅立叶变换
- 为什么要进行安全性测试?
- 心得二、感觉自己学不会一个东西怎么办?
- Google浏览器无法打开axure原型
- Centos 7.2 安装 Ambari 2.2.2 + HDP 2.4.2 搭建Hadoop集群
- codeforces 696D Legen...(AC自动机+矩阵快速幂)
- Cogs 647. [Youdao2010] 有道搜索框(Trie树)
- 为什么要进行代码加速?
- Double和double的区别
- iOS开发UINavigation——导航控制器UINavigationController
- 关于C10K、异步回调、协程、同步阻塞
- linux 平台中 Android5.0的更新包中system.new.dat文件的解包
- 对象序列化
- List-ArrayList 与LinkedList、Vector以及迭代器详解
- Java-springMVC框架:springMVC取参数值、把值放入作用域方法
- OpenResty Con 2016 见闻杂记