我想了解以下程序在主内存更新方面的工作原理。
int main() {
short a[256], b[256];
register i;
for (i=0 ; i < 256 ; i++)
a[i] = i;
for (i=0 ; i < 256 ; i++)
b[i] = 255 - i;
for (i=0 ; i < 256 ; i++)
b[i] = b[i] - a[i];
return 0;
}
我有一个16位的地址总线,主存储器以字节为单位,高速缓冲存储器大小为512 2路组关联,块大小为16字节,CPU只能从高速缓冲存储器中读取信息。
当我们使用Write Through no write allocate策略时会发生什么 什么时候我们使用Write back write分配策略?
答案 0 :(得分:0)
我假设
缓存内存大小为512
你的意思是512 byte
。
我们假设缓存为空,并且其中没有任何内容映射到a[]
或b[]
区域。
如果您的代码以回写方式运行,那么第一个循环将完全缓存。当发生未命中时,第三个循环将在a[i]
和b[i]
之后获取16个字节,并继续命中直到达到下一个块(8个迭代中1个未命中)。
使用write-allocate,前两个将每8次迭代一次,第三次循环全部命中。
在这种情况下,a[]
和b[]
属于同一组,因此对于“双向关联”部分来说很好。
但是,如果您声明超过4个大小为short[256]
的数组,则会产生冲突。
int main() {
short a[256], b[256], c[256], d[256], e[256];
register i;
for (i=0 ; i < 256 ; i++)
a[i] = i;// a in set0
for (i=0 ; i < 256 ; i++)
c[i] = 255 - i; //c in set 1
for (i=0 ; i < 256 ; i++)
e[i] = c[i] - a[i]; // e/c/a evacuates each other
return 0;
}