参考:http://www.cnblogs.com/yanlingyin/archive/2012/02/11/2347116.html
参考上面网址做了下题,是否正确并不能确定。
实验6 程序时空局部性访问
实验内容:
对于数据的访问,分别给出具有下列要求的程序或者程序段示例。
(1) 空间局部性和时间局部性都好。
int sumvec(int v[N])
{
int i,sum=0;
for(i=0;i<N;i++)
sum+=v[i];
return sum;
}
每次循环都会对sum访问一次,所以具有良好的时间局部性。
对数组v[N]按顺序访问,步长为1,所以有良好的空间局部性。
(2) 时间局部性好,空间局部性差。
int sumarrayrows(int a[M][N])
{
int i,j,sum=0;
for(j=0;j<N;j++)
for(i=0;i<M;i++)
sum+=a[i][j];
return sum;
}
每次循环都会对sum访问一次,所以具有良好的时间局部性。
对a[M][N]数组,以列为主序,先访问第一列,再访问第二列,步长为k,所以空间局部性较差。
(3) 空间局部性好,时间局部性差。
void example(int v[N],int p[N])
{
int i;
for(i=1;i<N;i++)
{
v[i]=p[i];
}
Return 0;
}
循环中没有对一个变量进行多次访问,所以时间局部性差。
因为循环中对数组是进行顺序访问,步长为1,所以空间局部性好。
(4) 时间局部性和空间局部性都差。
void example2(int a[M][N],int b[M][N])
{
int i,j;
for(j=0;i<N;j++)
for(i=0;i<M;i++)
a[i][j]=b[i][j];
return 0;
}
循环中没有对同一变量进行多次访问,所以时间局部性差。
对数组的访问中,以列为组序,先访问第一列,再访问第二列,没有按照数组的存储顺序来访问,步长为k,所以空间局部性差。