局部性原理是一个持久的概念,对硬件和软件系统的设计和性能都有着极大的影响。局部性通常有两种不同的形式:时间局部性和空间局部性。程序员是否编写出高速缓存友好的代码,就取决于这两方面的问题。对于下面这个函数,说法正确的是( )。int sumvec(int v[N]){ int i,sum=0; for(i=0;i<N;i++) sum+=v[i]; return sum;}
【正确答案】
C
【答案解析】解析:对于局部变量i和sum,循环体有良好的时间局部性。实际上,因为它们都是局部变量,任何合理的优化编译器都会把它们缓存在寄存器文件中,也就是存储器层次的最高层,故A、B错。 现在考虑对向量v的步长为l的应用。一般而言,如果一个高速缓存的块大小为B字节,那么一个步长为k的引用模式(这里k是以字为单位的)平均每次循环迭代会有min(1,(wordsizexk)/B)次缓存不命中。当k=1时,它取最小值,所以对v的步长为1的引用确实是高速缓存“友好”的,即拥有良好的空间局部性,故D错,只有C的说法是正确的。