cache line学习

1,389 阅读3分钟

存储器层次结构

高速缓存存储器

我们假设一个简单的存储器层次结构,cpu和主存之间只有一个L1高速缓存。
一个计算机系统,存储器地址有m位,形成2^m个地址。
缓存是一个S=2^s个高速缓存组的数组。
每个组包含E个高速缓存行(cache line)。
每个行由B=2^b字节的数据块组成,其中一个有效位指明这个行是否包含有意义的信息,还有t=m-b-s个标记位。


当一条指令想要读取地址A时,A中的s个组索引位告诉我们A的内容可能会缓存在哪个组中。
然后A中的t个标记位告诉我们哪一行包含这个数字,当且仅当设置了有效位并且该行的标记位与A中的标记位相匹配时,缓存才算命中。
然后根据b个偏移位,找到缓存中对应偏移处的数据。

为什么S位在地址中间,而不是高位?

如果用高位,那么连续的内存块就会映射到相同的高速缓存块。相比较而言,以中间位所谓索引,相邻的块总是映射到不同的高速缓存行。

例如对一个空间局部性良好的程序而言,假设每次从连续的空间读取数据,高位索引下,后一次读取会把前一次读取覆盖掉,导致高速缓存只保存着一个块大小的数据。

写的问题

直写:立即将高速缓存块协会到低一层中
写回:延迟更新,只有当替换算法要驱逐这个更新过的块时,才把它写到低一层中 写不命中的问题:(即要写的区域不在缓存中)

  • 非写分配:避开高速缓存,直接写入低一层中
  • 写分配:加载相应的块到高速缓存块中,更新高速缓存块

直写通常是非写分配的。 写回通常是写分配的。
存储器层次结构中较低层的缓存更可能用写回而不是直写。

一个真实的解剖

数据读取过程

这里只说DRAM

DRAM芯片

DRAM芯片总共分为d个超单元,每个超单元都由w个DRAM单元组成。w即位数。
超单元被组织成一个r行c列的长方形阵列,这里rc=d。
一次可以传送w位到DRAM芯片,或一次从每个DRAM芯片读取w位。
读取过程:

  • 将行地址r发送到DRAM,DRAM将整行都复制到一个内部行缓冲区。
  • 发送列地址l,从行缓冲区复制出超单元中的w位,并把他们发送到内存控制器。

内存模块

DRAM芯片封装在内存模块内。 要取出内存模块地址A处的数据,内存控制器将A转换成地址(i,j),然后广播到每个DRAM,每个DRAM输出它的(i,j)超单元的w位内容,并合并,返回给内存控制器。