Intel 平台编程总结----缓存的优化

对于软件的缓存访问问题进行优化的第一步应该是选择合适的编译器选项,使得编译器能够根据你的应用和要针对的处理器进行优化。每个处理器采用不同的缓存,比如通过QxW针对P4处理器进行优化,/O3允许一些循环分割、合并等激进优化,/Qipo通过过程间优化可以减少代码的大小,通过代码移动优化使得经常调用的变量和函数可以放在一起,增加了空间的局部性,采用Profile导向的优化,可以知道哪些分支经常使用,提高指令缓存和数据缓存的利用率。
虽然编译器的功能非常强大,但是也不是万能的,只有程序员才知道程序的具体行为,有的时候程序员也可以手工修改代码来帮助编译器进行更进一步的优化。那些具有更好的时间局部性的空间和时间局部性的代码一般会有更低的缓存缺失率,从而在大部分情况下回比那些高缺失率的代码运行得更快。考虑到好的时间局部性,那些经常访问的数据可以通过一个局部变量来保存,考虑到空间局部性,步长为1的内存访问显然是最好的。大部分的缓存优化都是针对那些访问数组元素的循环的,而提高这些循环的局部性,需要考虑循环访问数组的模式,从而分析是什么原因引起的缓存缺失,然后通过改变循环的顺序、结构、数组的布局等来减少缓存的缺失。
示例1:考虑下面的代码:

点击(此处)折叠或打开 
1.int sumarrarcols(int a[M][N])

2.{

3.int i,j,sum=0;

4.for(j=0;jkey,strlen(key))==0)

10.return head;

11.

12.head = head->next;

13.}

14.} 

查找List的循环中只用到结构中的8个字节,但是val占用的字节相对比较大,这样按照顺序访问时容易出现缓存的浪费,代码可以优化为:


点击(此处)折叠或打开 
1.typdef struct __LIST{ 

2.    cahr val[64];

3.    struct _LIST *next;

4.    }List;

5.    List list[MAX];

6.    char keylist[MAX*8];

7.    List *lookup(char *key,List *head,char *keyList,int nlist){

8.int i=0;

9.    while(i

你可能感兴趣的:(Intel 平台编程总结----缓存的优化)