1.1 什么是程序局部性?

良好的计算机程序通常有良好的局部性,局部性次要有:

  • 工夫局部性 :指的是同一个内存地位,从工夫维度来看,它可能在较短时间内被屡次援用。
  • 空间局部性 :指的是同一个内存地位,从空间维度来看,它左近的内存地位可能被援用 。

1.2 数据援用局部性

请看上面程序:

#例1int sumvec(int  v[N]){    int i,sum=0;    for(i=0;i<N;i++)    {    sum+=v[i];    }}

对于例1的程序,是否有良好的局部性?要答复这个问题就要看看程序中变量的援用模式。

变量sum被能在较短时间内屡次援用,所以具备很好的工夫局部性,然而没有援用到sum左近的内存地位,所以没有空间局部性可言。对于数据v,数据是顺序存储的,程序中也是按程序取元素(步长为1的援用模式,步长越大,空间局部性越差 ),元素左近的地位可能被援用,所以具备良好的空间局部性,然而对于同一个内存地位,只能被援用一次,所以工夫局部性很差。对于函数中每个变量 ,要么有工夫局部性,要么有空间局部性,所以说这个函数具备良好的局部性 。

在看上面的例子:

#例2 int sumvec(int  v[M][N]){    int i,j,sum=0;    for(i=0;i<M;i++)    {        for(j=0;j<N;j++)        {sum+=v[i][j];}    }}

二维数是依照行优先顺序存储的,而例2程序中,也是依照行优先读取元素 ,所以有很好的空间局部性,然而每个元素的内存地位只被援用一次,所以工夫局部性很差,再看例3。

#例3int sumvec(int  v[M][N]){    int i,j,sum=0;    for(i=0;i<N;i++)    {        for(j=0;j<M;j++)        {sum+=v[j][i];}    }}

例3依照列优先读取元素(程序具备步长为N的援用模式,读取下一个元素时候须要跳到步长N的地位),空间部分较差,所以例3的程序空间局部性和工夫局部性都比拟差。

1.3 取指令局部性

指令寄存在内存中,CPU须要将取出指令,在例2,例3的循环体中,放在同一个内存地位的程序指令在短时间内会被屡次读取,其左近的指令也会被屡次读取,所以具备很好的局部性。

先留个问题,程序指令如何寄存在内存中?