• PC_多模块存储器


    多模块存储器🎈

    • MMM:Multi module memory

    • 多模块存储器是一种空间并行技术

      • cpu的速度比存储器快,如果同时从存储器中读取n条指令,可以更充分利用cpu资源
      • 利用多个结构完全相同的存储模块的并行工作来提高存储器的吞吐率
      • 常用的方式有2种
    • 将地址分为两部分低地址

      • 高地址
      • 低地址

    单体多字存储器

    • 一个存储体的每个存储单元包含m个字(总线宽度也为m字)
    • 一次并行读出m个字
      • 前提: 地址必须顺序排列并且处于同一个存储单元
      • 在一个存取周期内,从同一地址取出m条指令,然后逐送至cpu
        • 相当于, 1 m \frac{1}{m} m1个存取周期cpu就可以取得一条指令

    多体并行存储器

    • 此处将存储体芯片也称为模块
      • 每个模块具有相同的容量和速度
      • 假设存储器有m个模块,分别记为 M 0 ∼ M n − 1 M_0\sim{M_{n-1}} M0Mn1
      • 每个模块具有k个存储单元
    高位交叉编址(顺序存储)
    • 程序按照体内地址顺序存放(一个存储体放满后再存入下一个存储体也叫顺序存储)
    地址结构
    • 高位地址表示体号
    • 低位地址表示体内地址
    特点
    • 这种方式通过合理调动,使不用的请求原同时访问不同的存储体,可以实现并行工作

      • 例如
        • 当一个存储体正在和cpu交换信息时,另一个存储体在通过DMA方式直接和外部设备进行直接存储器访问
        • 实现两个体并行工作
        • 由于体内地址连续,有利于存储器扩充
    • 这种方式依然是串行存取,不能提高存储器的吞吐率

    低位交叉编址(交叉存储)
    • 多体并行系统:
      • 采用多体模块组成的存储器
      • 每个模块具有相同的容量存取速度
      • 各模块各自都有独立的
        • 地址寄存器MAR
        • 数据寄存器MDR
        • 地址译码器
        • 驱动电路
        • 读写电路
        • 可以并行工作/交叉工作
      • 并行工作:
        • 同时访问N个模块,同时启动,同时读出
        • 完全并行地工作
        • 但是传送的时候,受到数据总线的限制,是串行的传送的(分时传送)
    地址结构
    • 高地址为存储体的体内地址

    • 低地址为存储体的体号

    • 通常体内地址位数远远多于体号(地址)(好几个数量级)

    • 程序连续地存放在相邻xianglin的模块中(因此,采用此方式编址的存储器也叫交叉存储器)

    • 每个模块按照 m o d    m \mod{m} modm交叉编址(也称低位交叉编址为模m编址)

      • m是参与编址的存储体模块数

      • 通常m是2的方幂,可以使得电路简单

      • m也可以是质数,有利于减少存储器冲突

      • 模 块 号 i = 单 元 地 址 / m 模块号i=单元地址/m i=/m

        • KaTeX parse error: Undefined control sequence: \set at position 5: i\in\̲s̲e̲t̲{0,1,\cdots{m-1…
      • 地址为 0 , m , ⋯ ( k − 1 ) m 0,m,\cdots{(k-1)m} 0,m,(k1)m(等差数列)的存储单元位于同一个模块 M 0 M_0 M0

        • 假设每个模块有k个存储字(存储单元)
        • M j [ i ] = j + i ⋅ m M_j[i]=j+i\cdot{m} Mj[i]=j+im
          • j ∈ { 1 , 2 , ⋯   , m } j\in\{1,2,\cdots,m\} j{1,2,,m}
            • j j j表示存储体编号(从0号开始)
          • i ∈ { 0 , ⋯   , k − 1 } i\in\{0,\cdots,k-1\} i{0,,k1}
            • i i i表示存储体内的存储单元编号,从0号开始
          • 例如:
            • 0号存储体的各个单元的地址分配: M 0 [ i ] = 0 + m M_0[i]=0+m M0[i]=0+m
      • index of Storage Unit M 0 M_0 M0 M 1 M_1 M1 M 2 M_2 M2 M 3 M_3 M3
        00123
        14567
        2891011
        312131415
        k − 1 k-1 k1 4 ( k − 1 ) 4(k-1) 4(k1) 1 + 4 ( k − 1 ) 1+4(k-1) 1+4(k1) 2 + 4 ( k − 1 ) 2+4(k-1) 2+4(k1) 3 + 4 ( k − 1 ) 3+4(k-1) 3+4(k1)

    • 采用低位交叉编址方式,可以在不改变每个模块的存取周期的前提下,采用流水线的方式并行存取
    🎈例
    • 假定用m=4片 16 k × 8 16k\times{8} 16k×8的芯片组成 64 k × 8 64k\times{8} 64k×8的低位交叉存储器

    • 地址BFFFH所在芯片的最小地址k?

      • 即,芯片的体号k

      • 地址分为体内地址体号

        • 低位交叉存储器的高位地址为体内地址

        • 低位地址为体号

      • 体号的位数取决于芯片数量m=4, log ⁡ 2 4 = 2 \log_2{4}=2 log24=2,因此需要用2bit来表示体号

        • 并且是地址二进制串的最低2bit
          • 或者说,用取模的方式计算: k = a d d r e s s m o d    m k=address\mod{m} k=addressmodm
          • 根据按权展开计算,容易发现,地址的最低两位就是体号k(从0开始编号)
        • k = 1 1 2 = 3 k=11_2=3 k=112=3
        • 用十六进制地址形式表示模块体地址,则为:0003H
    流水方式存取
    • 模块字长等于数据总线宽度

    • 模块存取周期为T

      • cpu每次访问一个存储体(多模块中的一个)

      • 存取周期:从开始访问到结束对某个模块的访问需要的时间为存取周期 T c , 简 记 为 T T_c,简记为T Tc,T

    • 传输周期为 T r , 简 称 为 r T_r,简称为r Tr,r

      • 将访问到的数据通过数据总线从存储器传输到cpu(MDR)中需要的时间,
    • 假设

      • T=200ns;

        • 每个存储体的存取周期
      • r=50ns

        • cpu经过时间r的延迟后,启动下个模块的访问

          • 之所以把延迟定为r,是因为

          • 如果启动2个存储模块的时间间隔小于总线传输周期,那么会造成总线冲突

          • 它们间隔不能够比总线传输周期r小(总线的分时特性)

        • 同时由于每个存储体的性能一样(存取周期一样)

          • 所以对应于它们的启动时间,间隔也是至少为r
        • 又考虑到cpu可能对同一个模块的多次访问,那么第二次访问到来之前必须保证前一次的访问任务结束

        • 也就是说,第二次访问同一个模块 M i M_i Mi的时间距离第一次的时间间隔至少为存取周期 T c T_c Tc

        • 基于上述分析,可以得出使得流水访问达到最高效率的条件:

          • 存储器交叉模块的存储体数量至少为 m = ⌈ T / r ⌉ ⩾ T / r m=\lceil T/r\rceil\geqslant{T/r} m=T/rT/r,这个值称为交叉存储器的交叉存取度
          • 满足上面的约束条件下,对于同一个模块 M i M_i Mi的连续两次访问间隔将不低于存取周期T
            • 启动同一个模块的间隔为 Δ t = m r = ⌈ T / r ⌉ r ⩾ ( T / r ) r = T \Delta{t}=mr=\lceil T/r\rceil{r}\geqslant{(T/r)r}=T Δt=mr=T/rr(T/r)r=T
          • 也就不要造成冲突,可以做到流水线不间断
            • 否则上一次访问的数据还没有传送出来,就开始新的访存操作,会导致错误
            • cpu中的中断机构也不允许这种情况发生(取值指令执行阶段尚未结束就被新的访存请求打断)
          • 理想情况下,交叉存储器存取m个字的时间为:
            • t = ( m − 1 ) r + T t=(m-1)r+T t=(m1)r+T
            • 设访问第一个字的存取周期的时间段为 [ s , e ] [s,e] [s,e]
            • 访问第m个字的存取时间段为 [ s m , e m ] [s_m,e_m] [sm,em]
              • s m ⩽ e s_m\leqslant{e} sme
            • 满足关系: 时 间 片 段 s m e ∈ [ 0 , r ) 时间片段s_{m}e\in[0,r) sme[0,r)
      • 模块字长等于数据总线的宽度,则每个存储字可以一次性传送完毕

      • cpu对m=4体交叉存储器的访问采用流水的方式访问

      • 那么连续访存的大致过程

        • 访问第一个存储体的时间点是0
        • cpu将它要读取的单元告诉给存储器后,有存储器的控制电路将数据传输给CPU
          • 花费的主要时间在于存储器内部的工作电路上,这部分时间cpu无法为其加速
          • 多体交叉存储器的每个芯片模块都具有独立的控制电路
        • 时间过了200+50ns,cpu取得第一个数据(包括数据总线上的传输时间)
        • 但是如果仅仅计算存储器取出数据(而不包括传输到cpu的MDR寄存器中的这段传输时间)
          • 那么这种经常用来计算存储器带宽
          • 🎈对于交叉存储器流水线存取时间的计算,是要考虑到访问同一个存储体的时间间隔,要考虑传送周期要区别开来.
          • 访问存储器的存取周期一般都明显大于总线传输周期
        • 如果考虑传送到MDR的这段时间:
          • 对于顺序串行访问存储器,在启动第二次访存前,总线已经将上次读取的数据通过数据总线,传输到MDR完毕,不需要而外加上传输周期(除了访问最后一个字的时候)
    小结:m体并行低位交叉存储器的理想性能指标公式
    存取m个字的时间
    • 对于m体低位交叉存储器,存取m位耗费的时间由公式

      • t m = ( m − 1 ) r + T t_m=(m-1)r+T tm=(m1)r+T
    存取一个字的平均时间
    • 最理想的情况下:平均访问一个存储字的时间

      • t a = t m m = r − 1 m r + T m t_a=\frac{t_m}{m}=r-\frac{1}{m}r+\frac{T}{m} ta=mtm=rm1r+mT
    • 该式子的极限为:

      • lim ⁡ m → ∞ t a = r \lim\limits_{m\to{\infin}}t_a=r mlimta=r

      • 实际情况,m往往会取得很大,因此平均存取一个字的时间趋近于r

      • 在m不太大(比如取4的时候,视情况有时可以近似认为 t a = r t_a=r ta=r)

    • 某机器采用4体低位交叉存储器
    • 分别执行一下操作:
      • 读取6个连续地址单元中存放的存储字,重复80次,耗时记为 t A t_A tA
      • 读取8个连续地址单元中存放的存储字,重复60次,耗时记为 t B t_B tB
      • 2种操作的耗费时间比例?
      • t m = ( m − 1 ) r + T t_m=(m-1)r+T tm=(m1)r+T
        • t 4 = 3 r + T t_4=3r+T t4=3r+T
      • t a = 1 4 t m t_a=\frac{1}{4}t_m ta=41tm
      • t A t B = 80 t a 60 t a = 4 / 3 \frac{t_A}{t_B}=\frac{80t_a}{60t_a}=4/3 tBtA=60ta80ta=4/3

    • 假设存取器容量为32字(字长为64bit=8Byte)
      • 模块数为m=4
      • 分别采用顺序方式和交叉方式进行组织
      • 存取周期T=200ns
      • 总线传输周期r=50ns
      • 在连续读出m个字的情况下,求顺序存储器和交叉存储器各自的带宽
    • 分析:
      • 读出m=4个字的总数据量为 q = 4 × 64 = 256 b i t q=4\times{64}=256bit q=4×64=256bit
      • 顺序存储器读取时间为 t 1 = m T = 4 × 200 = 800 n s t_1=mT=4\times{200}=800ns t1=mT=4×200=800ns
      • 交叉存储器读取时间:
        • 交叉存取度 m D = ⌈ T / r ⌉ = 4 m_D=\lceil T/r\rceil=4 mD=T/r=4
        • 恰好等于给定的模块数m=4
        • t 2 = T + ( m − 1 ) r = 200 + 3 × 50 = 350 n s t_2=T+(m-1)r=200+3\times{50=350}ns t2=T+(m1)r=200+3×50=350ns
      • 各自的带宽
        • W 1 = q / t 1 = 32 × 10 b / s W_1=q/t_1=32\times{10b/s} W1=q/t1=32×10b/s
        • W 2 = q / t 2 = 73 × 1 0 7 b / s W_2=q/t_2=73\times{10^7}b/s W2=q/t2=73×107b/s

    • 设一个四体并行交叉存储器

      • 每个存储体模块的容量是 16 k × 32 16k\times{32} 16k×32

      • 存取周期为200ns

      • 总线周期为50ns

      • 那么200ns内存储器最多可以提供多少数据给cpu?

        • 如果按照理想情况(流水线充分工作)
        • 存取一个字的平均时间是大致为r=50ns
        • 所以200ns可以存取4个字( 4 × 32 b i t = 128 b i t 4\times{32}bit=128bit 4×32bit=128bit)
      • 从每个存储体模块并行工作的角度看,每个周期4个存储体,可以各自独立地提供一个存储字(32bit)

        • 也可以得出200ns存储器提供128bit的数据给cpu
        • 但是传输的时候是串行传输的,这已经不是存储体的范畴,该部分是总线和cpu的性能问题

    • 某计算机按字节寻址

      • 有4个 64 × 8 b i t 64\times{8bit} 64×8bit的DRAM芯片采用交叉编址方式构成
      • 与宽度为32bit的存储器总线相连(对外表现为,该存储器的的存储字长为32bit)
      • 主存每次最多读取32bit数据
      • 若double类型(8B)变量x的主存地址为804001AH
      • 读取x需要的存储周期数?
    • 分析:

      • 多体存储器模块数为m=4

        • log ⁡ 2 4 = 2 \log_2{4}=2 log24=2

          • 四个存储体:00/01/10/11
        • 即看数据x的地址的二进制形式的最后两位即可判断出变量的首字节是保存在哪个模块(4个模块中的哪个)

        • …AH=…1010H,末两位为10,则首字节存放在10号存储体模块

        • 00011011
          ab
          cdef
          gh
        • 从字节a到字节h都是数据x的组成部分

        • 每个存取周期,可以对四个存储体各区一个字节数据

          • 参考边界对齐的内容
          • 需要三个存取周期才可以完整取出64bit的数据 x x x

    寻址空间和MAR位数问题

    • 计算机的实际主存容量和该机器的寻址能力不一定相一致
    • 比如,某计算机的实际容量为32MB,而地址空间可以是64MB,
      • 则MAR的寻址范围 64 M B 64MB 64MB;包含的字节数64M= 2 26 2^{26} 226)
      • MAR的位数为26
    • 可见,主存实际容量不代表MAR的位数
    • 考虑到存储器扩展的需要,MAR应该要保证访问整个主存地址空间
    • MAR的位数决定了主存地址空间大小

    地址区间问题

    • 假定用若干 2 k × 4 2k\times{4} 2k×4bit的芯片组成一个 8 k × 8 8k\times{8} 8k×8bit的存储器,则地址0B1FH所在芯片的最小地址?

      • 容易看出,需要 m = 4 × 2 m=4\times{2} m=4×2片芯片,

      • 每两片1组,构成 2 k × 8 2k\times{8} 2k×8bit的芯片组

      • 在将4组8位芯片再次进行字扩展,得到 8 k × 8 b i t 8k\times{8}bit 8k×8bit的芯片

      • 第一组 2 k × 8 2k\times{8} 2k×8bit芯片负责的地址范围

        • 一般此类问题是以存储字进行编址(地址+1,相当于指向下一个存储单元,并且指的是位扩展(即字长位数扩展)之后)的字长

        • 根据芯片容量以及每个存储字的字长,可以计算每个芯片编址的编址区间(或者区间宽度 Δ \Delta Δ)

        • 2 k × 8 b i t 8 b i t = 2 k = 2 11 \frac{2k\times{8bit}}{8bit}=2k=2^{11} 8bit2k×8bit=2k=211

        • 由于共有4组芯片( 2 k × 8 b i t 2k\times{8bit} 2k×8bit),所以需要地址线条数 log ⁡ 2 4 = 2 \log_2{4}=2 log24=2条来作为译码器输入产生4种不同片选信号(对应为地址码中的片内地址最高位再高2位

        • 因此本例中,需要2+11=13bit,就可以完成全部存储单元的寻址(8bit拼接单元)

          • 其中最高两位可以是

            • 00
            • 01
            • 10
            • 11
          • 所以,4组2k$\times$8位芯片的寻址区间分别为:

            • 芯片组编号(体号)最低地址最高地址
            • 最低地址

              • 0,0,000;0000;0000=0000H
              • 0,1,000;0000;0000=0800H
              • 1,0,000;0000;0000=1000H
              • 1,1,000;0000;0000=1800H
            • 最高地址分别是:

              • 和上述类似,但是可以更简洁地分为两部分写:
                • 低8位:FFH
                • 高5位(13-8=5):
                  • 0,0,111=07H
                  • 0,1,111=0FH
                  • 1,0,111=17H
                  • 1,1,111=1FH
                • 将高5位和低8位拼接起来
            • 综上,各片地址范围:

              • 0000 H ∼ 07 F F H 0000H\sim07FFH 0000H07FFH
              • 0800 H ∼ 0 F F F H 0800H\sim{0FFFH} 0800H0FFFH
              • 1000 H ∼ 17 F F H 1000H\sim{17FFH} 1000H17FFH
              • 1800 H ∼ 1 F F F H 1800H\sim{1FFFH} 1800H1FFFH
          • 0B1FH显然位于第二个芯片中(比较最高两位十六进制即可)

          • 那么第二个芯片的其实地址就是 0800 H 0800H 0800H

    主存空间的构成

    • 某计算机按照字节编址

    • 存储器容量64KB

    • 主存地址 4000 H ∼ 5 F F F H 4000H\sim{5FFFH} 4000H5FFFH为ROM区

    • 其余区域为RAM区

    • 使用 4 M × 4 b i t 4M\times{4}bit 4M×4bit的SRAM芯片进行设计,需要多少片?

      • SRAM是静态RAM,是也是易失性存储器,可以用来构造RAM(cache)

      • RMA size

        • 64 k B − ( 5 F F F H − 4000 H + 1 H ) × 8 b i t = 64 k B − 2000 H × 1 B = 64 k B − 2 × 1 6 3 B = 64 K B − 2 × 2 12 B = ( 64 − 8 ) k B = 56 K B 64kB-(5FFFH-4000H+1H)\times8bit =64kB-2000H\times{1B} \\=64kB-2\times{16^3}B \\=64KB-2\times{2^{12}B \\=(64-8)kB}=56KB 64kB(5FFFH4000H+1H)×8bit=64kB2000H×1B=64kB2×163B=64KB2×212B=(648)kB=56KB
      • m= 56 k B 8 k × 0.5 B = 14 \frac{56kB}{8k\times{0.5B}}=14 8k×0.5B56kB=14

    存储芯片阵列引脚复用和刷新问题

    • 假设DRAM芯片中存储阵列的行数为r;列数为c

    • 对于一个 2 K × 1 b i t 2K\times{1}bit 2K×1bit的DRAM芯片,为了

      • 保证其引脚数最少,
      • 尽量减少刷新开销,
      • r,c取什么值合适?©
        • A:2048;1
        • B:64;32
        • C:32;64
        • D:1,2048
    • 首先根据 DRAM采用的是行列地址线复用技术, 我们尽量选用行列差值不要太大的

    • 对于B、C 选项, 地址线只需 6 根(取行或列所需地址线的最大值,轻松排除A、D 选项。

    • 其次,为了 减小刷新开销,而 DRAM 一般是按行刷新的,所以应选行数值较少

    多模块存储器和局部性原理

    • 低位交叉存储器是交叉存放的,很好的满足了程序的局部性原理
    • 高位交存储器在单个存储器中的字是连续存放的,不满足局部性原理
      • 但是高位交叉存储器依然有可能一次性读出彼此相差一个存储体模块容量的4个字
      • 尽管这种可能性很小(不满足局部性原理)
      • Note:cpu访存时的规律是,每个存储体在一个存取周期时间片段内内只能够被cpu访问一次
        • 但是对于多模块存储器,是有多个独立的存储体模块构成的,不同的存储体模块芯片可以同时被访问
        • cpu向存储体发送访存命令信号是很快的,但是每个存储体完成cpu交代的任务则要慢的多
        • 多模块存储器的多个模块可以同时工作是可能的,但是通过总线将读出的数据传输给cpu的过程是串行的,需要排队传输

    双端口存储器:

    • 具有两套独立的读写口,具有各自的地址寄存器和移码电路
    • 可以访问同一区间,同一单元
    • 当两个端口同时对相同的单元进行读写操作,不会发生冲突
  • 相关阅读:
    02.k8s之docker容器
    无代码开发添加数据入门教程
    Pandas中常用的魔法命令与Linux命令
    看一眼就会的k8s权限管理手把手教学
    机器学习之自训练&协同训练
    python调用git出错:ImportError: Failed to initialize: Bad git executable.
    第75步 时间序列建模实战:多步滚动预测 vol-3(以决策树回归为例)
    2022年最新阿里Java高级岗200+面试题,掌握80%进阿里没问题
    我的世界Bukkit服务器插件开发教程(十一)粒子、药水效果与音效
    记 linux 系统编译好的exp提权提示无gcc
  • 原文地址:https://blog.csdn.net/xuchaoxin1375/article/details/128015542