csapp-局部性

Posted illfuckingkyzb

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了csapp-局部性相关的知识,希望对你有一定的参考价值。

局部性分为两中:时间局部性和空间局部性。

在时间局部性中,如果一个内存的位置被引用了一次,那么在将来有可能会被多次引用。

在空间局部性中,如果一个内存位置被引用了一次,那么在将来有可能这个内存附近的内存位置会被引用。

局部性的意义:局部性允许引入一个成为高速缓存存储器的存储器来保存最近被引用的指令和数据项,提高主存的访问速度。

接下来看个例子;

int sumvec(int v[N]){
   int i=0,sum=0;
for(i=0;i<N;i++)
     sum+=v[i];
return sum;

}

在这段代码中,我们可以看到,sum每一次循环都会被引用,因此sum具有良好的时间局部性。sum是一个标量,没有空间局部性,因为sum永远只占一个空间。

数组V在内存中的分布为

技术分享图片

很明显,v是一个矢量,在内存中连续分布,因此它具有良好的空间局部性,所以我们可以肯定sumvec具有良好的局部性

sumvec这样顺序访问一个向量每个元素的函数,具有步长为1的引用模式,我们称步长为1的引用模式为顺序引用模式。

一个连续向量中,·每隔k个元素进行访问,成为步长为k的引用模式,很明显,步长越长,空间局部性就越差。

接下来看一个空间局部性不连续的例子

int sumarraycols(int a[M][N]){
    int i,j,sum=0;
for(int i=0;i<N;i++)
for(int j=0;j<M;j++){
   sum+=a[j][i];

}
return sum;

}

a为一个二维矩阵,上面这个函数是按照列的顺序来访问二维数组的。由二维数组的内存结构可以看出,步长M,所以这个函数的空间局部性并不好。

看到一篇博客,写得挺好的,https://www.cnblogs.com/glczero/p/4478274.html。这里把二维数组的行扫描,列扫描的时间做了比较。

习题6.7
将 sum+=a[k][i][j]变成
sum+=a[i][j][k]即可
习题6.9
clear1函数就是一个一个扫描,步长为1
clear2函数会在vel和acc数组中不断地跳跃
clear3很明显最差。

 

以上是关于csapp-局部性的主要内容,如果未能解决你的问题,请参考以下文章

CSAPP书上一些图的相关整理

CSAPP第七章

CSAPP实验之Data Lab

CSAPP

优化程序性能(CSAPP:5)

CSAPP:代码优化矩阵读写