缓存内存组织

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; 
}