【问题标题】:Cache memory organization缓存内存组织
【发布时间】:2015-05-02 01:56:10
【问题描述】:

我想了解以下程序在主存更新方面的工作原理。

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-way set associative,块大小为 16 字节,CPU 只能从缓存中读取信息。

当我们使用 Write Through no write allocate 策略时会发生什么 什么时候我们使用回写写分配策略?

【问题讨论】:

  • 您的 CPU 有 8 KB 的缓存,您的代码使用 1 KB 的连续堆栈空间,此内存跨越 64 或 65 条不同的缓存行,所有内容都非常适合缓存。然而,实际的缓存行为取决于如何通过缓存读取程序代码,可能但不太可能导致争用以及如何在缓存写入时将数据读入缓存。第三个循环不应导致缓存未命中。

标签: c caching computer-architecture


【解决方案1】:

我假设

缓存大小为 512

你的意思是512 byte

让我们假设缓存是空的,并且其中没有映射到a[]b[] 区域的任何内容。

如果您的代码以回写方式运行,则第一个循环将完全丢失缓存。当发生未命中时,第三个循环将在 a[i]b[i] 之后获取 16 个字节,并继续命中直到到达下一个块(8 次迭代中 1 个未命中)。

使用 write-allocate,前两个循环每 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; 
} 

【讨论】:

  • 我通过 MIPSIt 模拟器运行程序,我更加困惑...如果 a[i],b[i] 数据类型是 1byte 并且每次成功访问缓存是 3cycles 怎么办,而主存的访问时间是30个周期,高速缓存和主存之间的每个块传输是10个周期?该程序还将 a[i] 的元素放入从 $2000 开始的地址,将 b[i] 放入 $3000 的地址。如何计算程序在每种情况下更新内存所需的时间?该程序显示 26.800cycles 用于 Write through no write allocate 和 6.400cycles for write back write allocate. 是否正确?
猜你喜欢
  • 2011-01-31
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 2010-12-21
  • 2011-01-31
  • 2010-12-13
  • 2013-05-01
  • 2015-05-25
相关资源
最近更新 更多