缓存内存组织
Cache memory organization
我想了解以下程序在主内存更新方面的工作原理。
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 策略时会发生什么
当我们使用写回写分配策略时会怎样?
我假设
cache memory size of 512
你是说512 byte
.
并且假设缓存是空的,并且其中没有任何映射到 a[]
或 b[]
区域的内容。
如果您的代码以回写方式运行,那么第一个循环将完全丢失缓存。第三个循环会在a[i]
和b[i]
之后取16个字节,当miss发生时,继续命中直到到达下一个块(8次迭代中有1个miss)。
使用写分配,前两个循环每 8 次迭代将有一个未命中,第三个循环全部命中。
在这种情况下,a[]
和 b[]
在同一个集合中,因此对于“2-way associative”部分来说没问题。
但是如果你声明了超过 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;
}
我想了解以下程序在主内存更新方面的工作原理。
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 策略时会发生什么 当我们使用写回写分配策略时会怎样?
我假设
cache memory size of 512
你是说512 byte
.
并且假设缓存是空的,并且其中没有任何映射到 a[]
或 b[]
区域的内容。
如果您的代码以回写方式运行,那么第一个循环将完全丢失缓存。第三个循环会在a[i]
和b[i]
之后取16个字节,当miss发生时,继续命中直到到达下一个块(8次迭代中有1个miss)。
使用写分配,前两个循环每 8 次迭代将有一个未命中,第三个循环全部命中。
在这种情况下,a[]
和 b[]
在同一个集合中,因此对于“2-way associative”部分来说没问题。
但是如果你声明了超过 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;
}