intel 软件优化学习笔记

转载请注明出处:http://blog.csdn.net/qingheuestc, by EinsteinInIct。

 

软件优化是一门艺术,需要从应用层算法,操作系统,硬件体系结构等多方面来考虑。一般来说,应用层算法和数据结构的设计对于提高程序的性能最为关键,但这也必须依赖于操作系统和体系结构所提供的计算模型。很多时候,人们会首先根据计算模型中的一些不变的东西,设计出应用层算法和数据结构,然后再根据具体的硬件体系结构做些微调。然后有时,我们不得不在这三者之间做出取舍。但到底该怎么做,我没有资格妄下断论。不过有一点可以肯定,越往底层走,技术要求越高,所花费的人力成本也越大,而收益则未必那么明显。不过,即便如此,对于一个好奇的程序员来说,总是喜欢去通过自己的努力,来提高程序的性能,哪怕是那么一点点(怎么说的好像有点像黑客精神)。

 

废话少说,下面的东西是我在看 intel 的《The software optimization cookbook》时的一点心得体会,跟大家分享一下。如果你想提高自己程序的性能,而又苦于没学过计算机体系结构,更不想去读intel的英文原版,那这篇文章不失为一个不错的选择。

1,写代码时,注意cache(此时的cache是广义上的,dram memory 是disk的cache,cpu 中的sram(也即常说的cpu中的cache,不过power7里面的部分3级cache貌似用的是dram)是dram的cache)大小,尽量将工作集都集中在更加高速的cache里面。在dram memory这一层,注意平台的physical memory的大小,估计可用的memory(物理内存减去操作系统所占用的内存)大小,在应用层选择合适的算法,预防频繁的内存miss。

 

2,对于for循环里面的代码,考虑的优化方式有:

(1),循环不变量的外提。如果其涉及到函数调用,更要多加小心。总之不要在循环里面做大量的重复性工作。

(2),c语言中,如果把临时用到的循环计数变量放在for循环的代码块里定义,则编译器会“很轻松”的将其放入寄存器中,从而提高访问效率,例如提倡for(int i ;.....)这种用法 。

(3),指令的流水,通过循环展开,减少load-to-use带来的影响。 

(4),充分利用寄存器。

 

3,利用局部性的方法

(1)   时间局部性:对于载入到高速缓存中的数据,要“充分”利用。

(2)   空间局部性:数据引用的步长尽量为“1”。

 

4,奔4cache参数:

(1)   L1:总大小:8K,cache line:64B,4 waysassociative,2K aligned。

(2)   L2: 总大小:256K,cache line128B, 8ways associative,8K aligned。

 

5,软件预取

       (1),可以使用cpu提供的预取指令对于将来要用到的数据提前加载到cache(L1,L2,L3)中(预取的数据大小为cache line),另外还可设置要对数据进行的操作。在循环中对数据进行预取一般比较容易写,但到底在何时将哪些数据预取到何处,要视具体应用、memory特性、memory controller特点和bus速度而定。

       (2),预取的好处是可以减少coolmiss,将对程序员不可见的cache可视化了,让人兴奋不已啊。

6,写数据时不通过cache

       在极少数情况下,cachewrites会有损性能和功能(比如适配卡上的控制寄存器以及其他的硬件缓冲区)因此,操作系统和设备驱动可以在内存中定义一些不能被cache的部分。当cpu需要写数据时,如果数据不在cache中,则cpu将向buffer中写数据。当数据需要被写回时,可以执行SFENCE指令,将数据立即写回(Lazy)。可以用汇编指令,intrinsics,或者有intel c++ compiler的c++库包来实现。

 

7,cache cool miss引起performance下降的来源:

(1)   强的数据相关性。

(2)   访问过多不能被提前cache的内存。

 

8,Vtune工具可以帮助分析哪些地方有cachemiss,以及他们引起的performance lose。

 

9,把工作集限制在一个小的data set上,可以有效减少capacity带来的损失,这种技术叫做stripmining或者blocking。

 

10,利用数据对齐来提高访存性能。编译器被要求对相应类型的数据进行对齐操作,只有在类型转换或者使用union或者不同类型的数据混合使用的时候才可能出现对齐的问题,这时候要自己想办法解决。

 

BTW:  不成熟的优化非但不能带来任何收益,反而有可能成为可怕的隐患。


你可能感兴趣的:(软件优化,高性能计算,学习手记)