【计算机基础】存储器层次 Memory hierarchy

我们是如何构建指令 / 数据存储器的?

img

以64位Arm处理器为例,内部有32个寄存器

  • Register file? Flip-flop构建

    • 32个64-bit 寄存器 -> 2Kb = 256Bytes
    • 可以使用多端口,bigger and slower but still ok
  • Instruction / data memory? 也是Flip-flop构建

    • each instruciton address has 64 bits

      -> 2^64 addressible unit

      -> 2^64 bytes -> 2^4 Exbi-bytes = 16EB (不可能的

  • “Primary” instruction / data memory 是单端口的SRAM

    • “Primary” = 在数据通路中

    • 只包含了一个memory的动态的子集

    • 缺失的部分到下一级内存查找

内存时序

对于内存元件M来说:

  • Access:从M中读或写

  • Hit:从M中获取所需数据

  • Miss:M中找不到所需数据

    • 必须从其他的部分得到
    • 没有“miss in register file” 的概念
  • Fill:将数据放到M

  • %_miss = miss rate(未命中率) :#misses / #access

  • t_hit:从M中读或写数据所用时间

  • t_miss:将数据送到M所用时间

  • 表现评估:平均访问时间(average access time)

    t_avg = t_hit + %_miss * t_miss

Problem: 很难在同一结构中做到低 t_hit 和低 %_miss

  • 大内存的结构 -> 低%_miss、高t_hit

    因为内存大所以找到所需数据的概率较高,未命中率低

    但寻找数据的时间相应会提高

  • 小内存的结构 -> 高%_miss、低t_hit

    因为内存小所以找到所需数据的概率较低,未命中率高

    寻找数据的时间降低

Solution: 使用Memory hierarchy,即存储器分层,中间以总线相连

M1 <-> M2 <-> M3 <-> M4 <-> M <->

  • 层次越高:内存越小 -> 高%_miss、低t_hit
  • 层次越低:内存越大 -> 低%_miss、高t_hit

M1中存储最频繁访问的数据,

M2中存储M1 + next most frequently 访问的数据

为什么Memory hierarchy有效?
  • 时间局部性

    最近被访问的指令/数据更可能在短时间内被访问

  • 空间局部性

    最近被访问的指令/数据附近的指令/数据更可能在短时间内被访问

所以,存储器系统是一个具有不同容量、成本和访问时间的存储设备的层次结构。存储器的容量和访问时间随着离处理器距离的增加而增加

请添加图片描述

存储器技术
  • DRAM

  • SRAM

  • Flash

    是一种电可擦除的可编程制度存储器(EEPROM)

  • 磁盘

Cache的基本原理

直接映射(direct mapped):每个存储器地址仅仅对应到cache的一个位置。

几乎所有的直接映射cache都使用以下的映射方法:

(块地址) mod (cache中的块数)

请添加图片描述

主存地址0-31被映射到cache的相同位置,该cache有8个字,所以地址X被直接映射到cache字X mod 8,即低log2(8) = 3位都被用作cache索引(index)。所以地址00001、01001、10001、11001都对应于cache中第101块。

由于cache中的每个位置对应于主存中多个不同的地址,所以我们在cache中增加标记(tag) 。标记包含了地址的高位(如上图的高两位),用于判断cache中的字是否就是所请求的字。

还有几位偏置位(offset bits) 用来确定字中的byte

除此之外,cache中还需要增加一个有效位(valid bit) 来标识一个块是否含有一个有效地址。

所以,cache的地址可以分为三个部分:

  • offset bit:最低 log2(block-size in bytes) bits

  • Index:接下来log2(number-of-sets) bits

  • Tag: 剩下的所有位

    (valid bit不在地址中)

请添加图片描述

Example cache:

8 sets, 32-bit words = 4-byte blocks, 16 bit address

-> 8 sets = 3 bits index

-> 4-byte blocks = 2 bits offset

-> 16 - 3 - 2 = 11 bits of tag

Cache访问

下面是对一个容量为8 blocks的空cache进行9次访问的一个序列(5-bit address, 3-bit index) 暂时不包括offset bits

请添加图片描述
请添加图片描述

访问缺失

当出现访问缺失(cache miss)的时候,由两部分来处理:处理器控制单元(Cache controller)和进行初始化主存访问和重新填充cache的独立控制器

如果cache不命中,那么它需要存储器层次结构中的下一层取出被请求的块,然后将新的块存储在组索引位指示的组中的一个高速缓存行中

Cache性能的评估和改进
减少cache miss的方法

直接映射(direct mapping):一个块只能放到cache中一个明确的位置。是一种极端的情况

另一种极端的情况:

全相联(fully associative):一个块可以被放置在cache中的任何位置,因此需要检索cache中所有的项,所以全相联只适合块数较少的cache。

介于直接映射和全相联之间的设计是组相联(set associative):块可以放置到cache中的部分位置(至少两个)。一个块首先被直接映射到一个组,然后检索该组中所有的块是否匹配。

请添加图片描述

For example:在直接映射的方式下,主存块12只能放置在cache中唯一的块中,该块为(12 mod 8)= 4。在两路组相联cache中,有四个组,主存块12必须放在第(12 mod 4)= 0组中,主存块可以放在该组的任何位置。在全相联的方式下,块地址为12的主存块可以放在cache中8个块的任意一块。

请添加图片描述

提高相联度的好处在于它通常能够降低缺失率,缺点则是增加了命中时间。

替换块的选择

当直接映射的cache发生缺失时,被请求的块只能放置于cache的唯一位置,而原先占据那个位置的块就必须被替换掉。

在组相联的cache中,被请求的块放置在什么位置需要进行选择,因此替换哪一块也需要进行选择。

在全相联cache中,所有的块都可能被替换。

  • 最常用的方法是最近最少使用(Least Recently Used,LRU)法,被替换的块是最久没有使用的那一块。

对于一个两路组相联cache,跟踪组中两个数据项的使用情况可以这样实现:在每组中单独保留一位,通过设置该位指出哪一项被访问过。

当相联度提高时,LRU的执行就变得困难。

  • Random 随机选一项被替换
  • FIFO
  • NMRU(not most recently used)
Cache ABC
  • Associativity

Decreases conflict misses

Increases t_hit

  • Block size

Increases conflict misses

Decrases compulsory misses

little effect on t_hit, may exacerbate t_miss

  • Capacity

Decreases capacity misses

Increases t_hit

访问缺失分类 Classifiying Misses

Compulsory(cold) : 从来没见过这个地址 -> block size ⬆️

Capacity :cache太小了 -> cache size ⬆️

Conflict:cache相联度太低 -> associativity⬆️

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值