当前位置: 首页 > 工具软件 > Memory > 使用案例 >

体系结构学习13-Memory

闾丘文昌
2023-12-01

1、Memory 概述

  • Processor and Cache <—> Memory <—> Storage( SSD/HDD)
  • 速度快于外部存储系统,但是断电后丢失数据

2、现代计算机主存成为瓶颈

  • 对于一个系统来说,主存是一个共享资源,需要保证资源分配公平公正。

  • 容量、带宽、能耗(率先频率)、DRAM尺寸(工艺决定其内存密度、功耗、访存速度上限)

  • DRAM:一个晶体管存电荷,读取时需要先充电然后放大信号,读取速度慢并且电容会漏电需要定期刷新耗电。

  • SRAM:六个晶体管、不需要刷新,但容量更小。

3、Memory Bank Organization

  • row * col:比如找到读取行,驱动行并且放大信号放在row buffer(相当于寄存器)耗费时间,然后在Row Buffer里面快速读取选择列(除非遇到close row 即没有在buffer里面的row),重新给行充电。

  • 如何提高DRAM访问效率?尽量访问连续内存地址、设计更好的内存访问控制算法兼顾效率与公平……

  • 并行访问bank以提高访问效率:每一个bank对应独立的内存地址空间。

  • Rank:多个低比特(比如8个8bits芯片读取64bit)芯片协作,而高比特芯片面积更大,出现缺陷可能性越高,成品率越低。

  • 多个控制器(多个总线)可以对不同内存条(内存地址)发送不同的内存指令。

  • 1 processor -> 连接多条总线
    ->一个总线连接多个内存条
    ->一个内存条有多个rank(片选)
    ->每个chip里面有多个bank
    -> 每个bank有各自独立的row buffer

  • 希望发起的bank请求能够均匀地分配在不同的bank

  • channel方式优劣:不同总线独立并行地访问内存,正比例增加带宽; 但是需要额外的内存控制器以及bus等额外线路。(一般2~3)

  • Address Mapping: row + h-col + bank + (l-col + bus )-> cache block

4、GDDR(GPU)

GDDR6 112~256 GB/s

  • 3D垂直堆叠(HBM),引脚直接连接,减少线路长度

5、DRAM Controller

  • 控制访存请求、开关内存条节能等

  • DRAM Refresh
    Burst Refresh:DRAM 停下来花费64毫秒刷新
    Distributed Refresh:DRAM 每次Refresh部分内存数据,将64毫秒拆分成更短的时间。

    64ms是一个保守刷新时间,不同的行可能保持电荷时间不一样。
    Profile:记录不同行需要刷新的时间间隔
    Binning:但是存储这些信息需要额外资源 -> 使用 Hardware Bloom Filters

  • 放置位置:
    in chip set: 早期(2012)放在计算机芯片组中的北桥芯片(高速外设以及内存)
    on CPU chip:现在多在CPU内部集成,交互速度快,集成度更高,可靠性更高

  • 主要任务:保持系统对Memory latency的容忍

    (1)内存访问请求scheduling
     比如使用FCFS策略——可能反复开关row,效率低;如果能够连续访问已经打开的row则可以提高效率……
    (2)Open/Close row:保持row,下一次访问该row能更快,但是如果访问其他row则会更慢——>根据执行经验预测

  • 减少Memory Latency——MLP(Memory Level Parallel)
    利用cache、减少stall(多个stall并行)、Prefetching(预取)、多线程、乱序……

6、 Bloom Filter

将不同刷新间隔的内存数据分组

  • 用1bit精确判断某个元素是否在某个集合,但是资源消耗过多

  • Approximate set membership
    insert:某行需要刷新,用Hash把行号打乱,然后插入到Bloom Filter
    test:
    remove all element:无法单独删除某个元素,只能全删

  • 优点:用较少的比特存放set membership,insert 和 test很快, 没有false negative(需要刷新的一定会是需要刷新态)

  • 缺点:可能会将不需要刷新的刷新(false positive)

  • 在路由器中也有应用

(那加入写入了新的数据,如何判断刷新?False positive)

7、Prefecthing

  • 主要思想:提前向存储单元发起数据访问请求,避免Memory Latency。降低cache miss和cache miss latency。
  • 能够避免第一次访问miss,但是可能把cache中可能用到的数据替换,造成cache miss。并且可能预取出错,但是不会影响程序正确性,只会影响效率。
  • 主要步骤
    What:取什么数据?取错了会浪费cache空间、带宽、能源。所以要提高准确性 = 使用的数据 / 发出请求的数据
    When:什么时候去取数据?取回太早会占用cache时间过长,而且可能会被替换出去。太晚预取基本没有效果。
    Where:把取回的数据放在那里?(L1、L2cache?)直接简单放在cache,但是没有用的数据会污染cache;单独放在buffer(SRAM),系统复杂度增加。降低Prefetch data优先级。
    How:用软件(编译器确定数据预取)还是硬件方式(通过经验训练预取器)实现

8、Prefetch 实现

  • 实现方式
    (1)Software :程序员或编译器负责指定,ISA提供相应指令
    (2)Hardware:记录程序访存的pattern来预测
    (3)Execution-based :单独运行一个线程monitor程序运行状态(S/H均可)

  • Software Prefetch
    Intel X86有相应指令,在程序内部主动增加Prefetch指令。
    但是会增加额外指令(Alpha选择load 到31号寄存器来实现Prefetch),程序员也很难判断什么时候加入Prefetch。

  • Hardware Prefetch
    特定硬件实现,适配性好,不会浪费指令空间。但是硬件可能很复杂,成本上升。
    如何学习Pattern
    (1)基于Program Counter
    记录Address、Last stride,如果是load就Prefetch。
    局限性:如果拿到了load指令,其实马上就要执行了,Prefetch效果甚微。
    解决办法:提前看后面的指令;同时发出多条Prefetch指令;提前Prefetch(Address + N*stride)
    (2)基于Cache Block Address
    stream buffers:每次stride +1

  • 指标
    Accuracy:used pre /sent pre
    Coverage: 是否能让所有miss来自于pre miss
    Timeliness: Pre 是否准时
    Bandwidth:如果取太多无效无效数据浪费带宽
    Cache pollution:清除了多少有效数据

    Aggressive Prefetcher: coverage 增加,timeless更好 。但是accuracy 降低,带宽使用增加,cache pollution增加
    Conservative Prefetcher:高准确性,低带宽,少cache污染。但是低覆盖、低准时

 类似资料: