对于一个系统来说,主存是一个共享资源,需要保证资源分配公平公正。
容量、带宽、能耗(率先频率)、DRAM尺寸(工艺决定其内存密度、功耗、访存速度上限)
DRAM:一个晶体管存电荷,读取时需要先充电然后放大信号,读取速度慢并且电容会漏电需要定期刷新耗电。
SRAM:六个晶体管、不需要刷新,但容量更小。
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
GDDR6 112~256 GB/s
控制访存请求、开关内存条节能等
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(预取)、多线程、乱序……
将不同刷新间隔的内存数据分组
用1bit精确判断某个元素是否在某个集合,但是资源消耗过多
Approximate set membership
insert:某行需要刷新,用Hash把行号打乱,然后插入到Bloom Filter
test:
remove all element:无法单独删除某个元素,只能全删
优点:用较少的比特存放set membership,insert 和 test很快, 没有false negative(需要刷新的一定会是需要刷新态)
缺点:可能会将不需要刷新的刷新(false positive)
在路由器中也有应用
(那加入写入了新的数据,如何判断刷新?False positive)
实现方式
(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污染。但是低覆盖、低准时