91
1/91 第 5 第 第第第第 授授授授 授授授 [email protected]

第 5 章 存储层次 授课教师:车喜龙 chexilong@jlu

  • Upload
    duff

  • View
    112

  • Download
    21

Embed Size (px)

DESCRIPTION

第 5 章 存储层次 授课教师:车喜龙 [email protected]. 5.1 存储器的层次结构 5.2Cache 基本知识 5.3Cache 性能优化 5.4 主存 5.5 虚拟存储器. 5.1 存储器的层次结构. 5.1.1 从单级存储器到多级存储器 从用户的角度来看,存储器的 三个主要指标: 容量、速度和价格(指每位价格) 人们对这三个指标的要求:容量大、速度快、价格低 三个要求的相互关系 速度越快,每位价格就越高; 容量越大,每位价格就越低,但速度越慢。 存储器系统的设计矛盾 高性能速度要求:容量小,价格高 - PowerPoint PPT Presentation

Citation preview

1/91▲

第 5 章 存储层次

授课教师:车喜龙

[email protected]

2/91▲

5.1 存储器的层次结构5.2 Cache 基本知识5.3 Cache 性能优化5.4 主存5.5 虚拟存储器

3/91▲

5.1.1 从单级存储器到多级存储器1. 从用户的角度来看,存储器的三个主要指标:

容量、速度和价格(指每位价格)2. 人们对这三个指标的要求:容量大、速度快、价格低3. 三个要求的相互关系

速度越快,每位价格就越高; 容量越大,每位价格就越低,但速度越慢。

4. 存储器系统的设计矛盾 高性能速度要求:容量小,价格高 用户性价比要求:容量大,价格低

5.1 存储器的层次结构

4/91▲

5.1 存储器的层次结构

5. 解决方法:采用多种存储器技术,构成所谓的存储层次,使得从 CPU 看来,整个存储系统速度接近于第一层,而容量接近于最后一层。

5/91▲

5.1 存储器的层次结构

平均每位价格 C C= 总价格 / 总容量

命中率与失效率 H&F (Hit Rate, Fault Rate) H= 访问命中次数 / 对存储系统的总访问次数 F= 访问失效次数 / 对存储系统的总访问次数 H + F = 1

平均访存时间 T T= 命中率 x 命中时间 + 失效率 x 失效时间 T= 命中时间 + 失效率 x 失效开销 失效时间 = 命中时间 + 失效开销

5.1.2 存储层次的性能参数

6/91▲

5.1 存储器的层次结构

存储层次的性能计算例子 假设某计算机系统包含两级存储层次 M1 和 M2 M1 的参数:价格 C1 ,访问次数 N1 ,访问时间 T1 ,容量 S

1 M2 的参数:价格 C2 ,访问次数 N2 ,访问时间 T2( 包含 M2

的操作时间和 M2 向 M1 传输的时间 ) ,容量 S2 则如何计算整个存储层次的 C , H , F , T ?

解: C = (C1 x S1 + C2 x S2) / (S1 + S2) F2=H1=N1/ (N1+N2) F1=H2=N2/ (N1+N2)

H=H1+H2=1 F=1-H =0 实际只看重 F1 和 H1 T = H1 x T1 + (1-H1) x (T1+T2) 解毕 .

7/91▲

5.1 存储器的层次结构

5.1.3 “Cache -主存-辅存”存储层次

8/91▲

5.1 存储器的层次结构

存储层次

CPU 对第二级的访问方式

比较项目

目  的

存储管理实现

访问速度的比值( 第一级和第二级 )

典型的块 ( 页 ) 大小

失效时 CPU 是否切换

“Cache -主存”层次 “ 主存-辅存”层次

为了弥补主存速度的不足 为了弥补主存容量的不足

主要由专用硬件实现 主要由软件实现

几比一 几百比一

几十个字节 几百到几千个字节

可直接访问 均通过第一级

不切换 切换到其他进程

“Cache -主存”与“主存-辅存”层次的区别

9/91▲

5.1 存储器的层次结构

数据传递 CPU 与 Cache 之间数据传递的单位:字节 如 1B Cache 与主存之间数据传递的单位:块 如 4B 主存与辅存之间数据传递的单位:段或页 如 4KB

整个存储层次以内存为基础进行分割 内存空间分为 M 个页,每个页分为 N 个块,每个块内有 P 个字节。 内存空间中共有 MxN 块, MxNxP 个字节 Cache 空间分为 n 个块, cache 块大小 = 内存块大小, n<MxN 辅存空间分为 K 个页,辅存页大小 = 内存页大小, M<K

主存地址按位划分为 3 个部分: { 标识 Tag ,索引 Index ,偏移 Offset} 例 {10,01,111} 第 9 块第

7B Tag 和 Index 的位数随系统结构不同而不同,两个字段拼起来得到

的数值,即为该地址所属的内存块地址。 Offset 表示待访问的字节是该块中的第几个字节。

数据传递,空间分割与地址计算

10/91▲

5.1 存储器的层次结构

映像规则 当把一个数据集合 ( 块或页 ) 从下一层存储器调入上一层存

储器时 ( 更靠近 CPU) ,该集合可以放在哪些位置上 查找算法

当所要访问的数据集合在某一层存储器中时,如何找到该块 替换算法

当把一个数据集合 ( 块或页 ) 从下一层存储器调入上一层存储器时 ( 更靠近 CPU) ,根据映像规则需要放在特定位置上,但该位置已经被使用,则应该替换掉哪个位置

写策略 当把一个更新的数据集合写入某一层存储器中时,是否将该

更新传递到各个下层存储器中 ( 更远离 CPU)

5.1.4 存储层次研究的四个问题

11/91▲

5.2 Cache 的基本知识 Cache 特征

速度快:可看做是 CPU 的一部分,访问开销为几个周期 容量小:可缓存 n 个块, n 远小于内存总块数 MxN

(上百 vs 上万) 原理: CPU 发出访存请求,如果 cache 中恰好缓存了,

则不必访问内存,直接从 cache 获得数据。

5.2.1  映象规则 全相联映象 直接映象 组相联映象

12/91▲

1. 全相联映象 全相联:主存中的任一块可以被放置到 Cache 中的任

意一个位置    举例:阅览室位置 ── 每人可以随便坐任意椅子 特点:空间利用率最高,冲突概率最低,实现最复杂。 主存的第 i 块 映象到 Cache 的第 j 块, j=1..n

j =任意 x , x 属于 {1,2,…,n} 内存地址的位分布 { 标识 Tag,索引 Index ,偏移Off

set} Index 共 0 位, 主存块地址完全由 Tag 部分构成

5.2 Cache 的基本知识

13/91▲

5.2 Cache 的基本知识

主存 i Cache j=任意 x , x属于 {1,2,…,n}

14/91▲

5.2 Cache 的基本知识

2. 直接映象 直接映象:主存中的每一块只能被放置到 Cache 中唯一

的一个位置,每个 cache 位置被循环分配给内存块 对比:阅览室位置 ── 每人只能坐固定椅子 特点:空间利用率最低,冲突概率最高,实现最简单。 主存的第 i 块 映象到 Cache 的第 j 块, j=1..n

j = i mod n 内存地址的位分布 { 标识 Tag,索引 Index ,偏移Offse

t} 假设 cache 中一共有 2m 个块,即 n=2m

Index 共 m 位,主存块地址由 Tag 和 Index 两部分构成

15/91▲

5.2 Cache 的基本知识

主存 i Cache j= i mod n

本例中,N=8=23, 则m=3 , Index3 位主存块地址 i=Tag+Index随主存块地址不断增加,其低 3 位呈现 0-7的循环,该块在 cache 中映像位置也正好会呈现 0-7的循环。因此可以用块地址的低 3位来判断对应的 cache 位置,即 Index功能。

16/91▲

5.2 Cache 的基本知识

3. 组相联映象 组相联:主存中的每一块可以被放置到 Cache 中唯一的一个组中的

任何一个位置。每个组被循环分配给内存块 对比:阅览室位置 ── 一个桌子对应多把椅子。每人只能坐固定桌

子,但可以坐在这个桌子的任意椅子 特点:是直接映象和全相联的性能折中

全相联 空间利用率最高,冲突概率最低,实现最复杂。 直接相联 空间利用率最低,冲突概率最高,实现最简单。

主存的第 i 块 映象到 Cache 的第 j 块, j=1..n j =任意 x , x 属于 cache 的第 k分组, k= i mod G (cache组数 )

内存地址的位分布 { 标识 Tag,索引 Index ,偏移Offset} 假设 cache 中一共有 2m 个块,即 n=2m

假设 cache 中一共有 2p个组,即 G=2p p<m , G<n Index 共 p位,主存块地址由 Tag 和 Index 两部分构成

17/91▲

5.2 Cache 的基本知识

主存 i Cache j= 任意 x , x属于第 k组。k = i mod G

本例中,G=4=22, 则 p=2 , Index2 位主存块地址 i=Tag+Index随主存块地址不断增加,其低 2 位呈现 0-3 的循环,该块在 cache 中映像组号也正好会呈现 0-3 的循环。因此可以用块地址的低 2位来判断对应的 cache 组号,即 Index功能。

18/91▲

5.2 Cache 的基本知识

t路组相联 每组中有 t 个块 t = n/G 称为相联度。 相联度越高, Cache 空间的利用率就越高,块冲突概率就越低,失效率也就越低。

大多数计算机的 Cache: t ≤4

G (Cache组数 )

t (Cache路数,即每组的块数 )

Index 位数

全相联 1 n = 2m 0

直接映象 n = 2m 1 m

组相联 G = 2p p<m t= n/G = 2(m-p) p

19/91▲

5.2 Cache 的基本知识

1. Cache 的结构: 每个 cache 块对应 4项信息,分布在 2张硬件表格中 2张表条目相等,一一对应 Data 缓存的数据, Tag数据地址的 Tag 字段 EF有效位 Effective Flag, DF修改位 Dirty Flag

5.2.2 查找算法

Data

Cache Data Table

Tag

Cache Lookup Table

DFEF

Data TagDFEF

Data TagDFEF

Data TagDFEF

Data TagDFEF

Data TagDFEF

Data TagDFEF

Data TagDFEF

20/91▲

5.2 Cache 的基本知识

2. Cache 的查找 查找原理

当 CPU 访问 Cache 时,如何确定 Cache 中是否已经缓存了所要访问的块?若已缓存,如何确定其在 cache 中的位置?如何获取数据?

用 Cache Lookup Table( 目录表 )匹配主存地址 用 Cache Data Table( 数据表 )获取对应的数据

查找方法 和谁比?候选位置的确定 如何比?匹配条件的判断

21/91▲

5.2 Cache 的基本知识

候选位置的确定

全相联:所有 cache 块均为候选位置

直接映像:只有一个 cache 块为候选位置,用 index确定

组相联:只有一组 cache 块为候选位置,用 index确定

22/91▲

5.2 Cache 的基本知识

匹配条件的判断 全相联

For any X in Cache, (X.Tag==A.Tag) & (X.EF==1)

直接映像 用 indeX计算唯一 cache 块 X , (X.Tag==A.Tag) &

(X.EF==1)

组相联 用 indeX计算唯一 cache组 k , for any X in 组 k ,

(X.Tag==A.Tag) & (X.EF==1)

TagDFEF

Tag Index Offset

目录表项X:

主存地址A:

相等?

23/91▲

5.2 Cache 的基本知识

3. Cache 的查找过程优化 基于主候选位置 (MRU 块 ) 的顺序查找

局部性原理,刚刚用过的 cache 块最可能被复用,即为MRU(Most Recently Used)

多个候选位置的循环查找,从 MRU 开始,优于从顺次第一个开始

并行查找 相联存储器 单体多字存储器+比较器

24/91▲

5.2 Cache 的基本知识

25/91▲

5.2 Cache 的基本知识

26/91▲

5.2 Cache 的基本知识

1. 替换原理:当要从内存新调入一块,而 Cache 中对应的一个或多个候选位置均已被占满时,替换哪一块? 直接映象 Cache 的替换

很简单,因为只有一个块,别无选择。 组相联和全相联 Cache 的替换

有多个块供选择,主要的替换算法有三种: 随机法或循环法,实现简单,没有利用局部性 先进先出法( FIFO),部分利用局部性 最近最少使用法 (Least Recently Used, LRU) ,充分利用局部性

5.2.3 替换算法

27/91▲

5.2 Cache 的基本知识

对于大容量 cache , LRU 和随机法的失效率几乎没有差别。

28/91▲

5.2 Cache 的基本知识

1. 访存操作 统计结果表明,对于一组给定的程序:

load指令: 26%, store指令: 9 % “ 写”在所有访存操作中所占的比例:  9% /(100%+ 26%+ 9% )≈7% “ 写”在访问 Cache操作中所占的比例:  9% /(26%+ 9% )≈25%

举例: 100条指令构成的序列,其中 9条 st , 26条 ld运行时,取指令访存 100 次,执行指令访存 9+26 次

5.2.4 写策略

29/91▲

5.2 Cache 的基本知识

读操作 读操作占的比例大,优化能够明显提高性能 优化方法:从目录表读 Tag 与从数据表读Data并行执行,命中

与读同时进行 无论从内存读还是从 cache读,读操作不改变对应存储单元的

值 写操作

虽然写操作占的比例小,但高性能 cache也要重视写操作的性能

不能采用读操作的优化方法,命中与写只能串行,写比读开销大 写操作要改变对应存储单元的值,而且会导致内存和 cache 内

容的不一致,即产生 dirty cache 块 如何保证内存和 cache 内容的一致性,是写策略解决的问题

30/91▲

5.2 Cache 的基本知识

2. 两种写策略 写直达法

执行“写”操作时,不仅写入 Cache ,而且也写入存储器

易于实现,一致性好,写操作返回较慢 优化方法:写入 cache后,接着写入写缓冲(WB ,Wr

ite Buffer,相当于后行写数站),立刻返回,由写缓冲慢慢将数据写入内存。

替换写回法 执行“写”操作时,只写入 Cache ,并将对应 DF 位置 1 。 当任意一个 Cache 块将要被替换时,检查其 DF 位

如果DF 位为 1 ,则先将该 Cache 块写回存储器,再进行替换动作;

如果DF 位为 0 ,则不用写回存储器,直接进行替换动作 

对存储器带宽要求较低,写操作返回较快,写内存的开销转移给了 cache 块替换时写内存的开销

31/91▲

5.2 Cache 的基本知识

3. Cache 写失效的处理方法 当 CPU 发出一条内存写的指令,且该地址没有命中 cache ,

则发生了 cache 写失效。 经过 cache 法 (按写分配 ) :发生写失效时,先把地址对应

的内存块调入 Cache ,再进行写操作。 绕过 cache 法 ( 不按写分配 ) :发生写失效时,不把地址对应的内存块调入 Cache ,而是绕过 cache 直接将数据写入存储器

4. 写策略与写失效处理的搭配 写直达法 +经过 cache 不常用 写直达法 +绕过 cache 常用 替换写回法 +经过 cache 常用 替换写回法 +绕过 cache 不常用

32/91▲

5.2 Cache 的基本知识

DEC 的 Alpha AXP21064 中的内部数据 Cache 容量: 8 KB = 块大小 32 B x 块数 256 CPU字宽:每个字64bit ,因此一个 Cache 块含 4 个字( 32*8/6

4 ) 直接映象 + 写直达 +绕过 cache+ 写缓冲器( 4 个块,块大小 32B)

主存地址 34bit={Tag-21bit,Index-8bit,Offset-5bit}

Index 位数如何计算?2Index=Cache 块总组数 =Cache 容量 /组内块数 x 每块大小

Offset 位数如何计算?每个块内 32B ,内存按字节寻址,所以字节偏移 Offset 为 5 位CPU 每次取一个字,而不是一个字节,第一个字偏移 0 ,第二个字偏移为 8 ,第 3 个字偏移为 16 ,第 4 个字偏移 24 ,转成二进制后offset 低 3 位均为 000 ,因此Offset 高 2 位为字偏移

5.2.5 一个 Cache 结构实例

33/91▲

5.2 Cache 的基本知识

Data

Cache Data Table

Tag

Cache Lookup Table

DFEFDataTagDFEFDataTagDFEFDataTagDFEFDataTagDFEFDataTagDFEFDataTagDFEFDataTagDFEF

Tag Index Offset(1)A读命中

B写命中 CPU

(2)

Tag DataEF

(2)(2) (2)

(3)

(3)

(3) (3) (3)

Match Logic Word (A)

(A)(B1)

(B2)

WB

(B3)

MEM

(B4)

数据Cache工作过程

Cache失效怎么办?

34/91▲

5.2 Cache 的基本知识

指令 Cache 以上结构中数据字段存放的是指令字 只有读操作,没有写操作

数据 Cache 以上结构中数据字段存放的是数据字 既有读操作,又有写操作

混合 Cache 指令 cache 与数据 cache 使用同一套硬件 对于 ld/st 指令,取指令和指令执行结构冲突

分离 Cache 指令 cache 与数据 cache各自使用一套硬件 针对各自的特点进行优化,并设置不同的参数

如容量,相联度等

35/91▲

5.2 Cache 的基本知识

16 KB

容 量

1 KB2 KB4 KB8 KB

32 KB

指令 Cache

3.06%

失 效 率 的 比 较

64 KB

128 KB

数据 Cache 混合 Cache

2.26%

1.78%

1.10%

0.64%

0.39%

0.15%

0.02%

24.61%

20.57%

15.94%

10.19%

6.47%

4.82%

3.77%

2.88%

13.34%

9.78%

7.24%

4.57%

2.87%

1.99%

1.36%

0.95%

36/91▲

5.2 Cache 的基本知识

分离 Cache 平均失效率如何计算? 指令 Cache 的访问百分比×指令 Cache 的失效率+数据 Cache 的访问百分比×数据 Cache 的失效率

容 量

1 KB2 KB

指令 Cache

3.06%

数据 Cache 混合 Cache

2.26%

24.61%

20.57%

13.34%

9.78%

举例 分离 Cache 性能 v.s.混合 Cache 性能 2KB混合 Cache v.s. 1KB数据 Cache+ 1KB指令 Cache 3.06%*指令 Cache 的访问百分比

+24.61%*数据 Cache 的访问百分比v.s. 9.78%

37/91▲

5.2 Cache 的基本知识

1. 失效率2. 平均访存时间

存储系统性能的评价指标 该指标比失效率更有效 计算公式:

平均访存时间 = 命中时间+失效开销×失效率= 命中时间× 命中率 + ( 命中时间 + 失效开销 ) × 失效率

5.2.6 Cache 的性能分析

38/91▲

5.2 Cache 的基本知识

例 5.1 假设:

( 1)一段程序运行时, 75%的访存为取指令

( 2)取指令的 Cache 命中时间为 1 个时钟周期

( 3)访存指令的 Cache 命中时间为 1 个时钟周期

( 4) Cache 失效开销为 50 个时钟周期

( 5)分离 Cache ,指令 Cache 和数据 Cache 容量均为 16 KB

( 6)混合 cache ,容量为 32 KB

( 7)采用写直达策略,且有一个写缓冲器,并且忽略写缓冲器引起的等待。

问:根据下表的失效率,哪种 Cache 的失效率更低?平均访存时间各是多少?

16 KB

容 量

32 KB

指令 Cache 数据 Cache 混合 Cache

0.64%

0.39%

6.47%

4.82%

2.87%

1.99%

39/91▲

5.2 Cache 的基本知识

解:( 1)分离 Cache 的总体失效率为:     ( 75%×0.64%)+( 25%×6.47%)= 2.10%   32KB混合 Cache 的失效率只有 1.99%,性能更好。

( 2)平均访存时间=  指令访存百分比×(指令 Cache 命中时间+指令失效率×失效开销)+

数据访存百分比×(数据 Cache 命中时间+数据失效率×失效开销)

所以,两种结构的平均访存时间分别为:T 分离 = 75%×( 1+0.64%×50) +25%×( 1+6.47%×50)= 2.05T 混合 = 75%×( 1+1.99%×50) +25%×( 1+1+1.99%×50)= 2.24因此,尽管分离 Cache 的实际失效率比混合 Cache 的高,但其平均访存时间反而较低。因为分离 Cache提供了两个端口,消除了结构冲突。

解毕。

40/91▲

5.2 Cache 的基本知识

3. 程序执行时间程序执行的 CPU 时间=程序执行的时钟周期数 × 时钟周期时间 (A)程序执行的时钟周期数= CPU运算的周期数 C1+CPU等待数据而停顿的周期数 C2 ( B)

Cache算作 CPU 一部分,因此 Cache 命中时间归入 C1 , Cache 失效时间归入 C2C1 的计算方法: C1=IC×理想 CPI ( C)C2 有两种计算方法:C2A=读的次数×读失效率×读失效开销+写的次数×写失效率×写失效开销 (D)

C2B =总访存次数×失效率 R×Cache 失效开销 (E)R有 2种计算方法:RA= 每次访存的平均失效次数 = 总失效次数 / 总访存次数 ( F)(结构相关)RB= 每条指令的平均失效次数 = 总失效次数 / 总指令数 (G)(结构无关)

41/91▲

5.2 Cache 的基本知识

例 5.2 假设 Cache 失效开销为 50 个时钟周期,当不考虑存储器停顿时,所有指令的执行时间都是 2.0 个时钟周期,访问 Cache 失效率为 2%,平均每条指令访存 1.33 次。试分析 Cache 对性能的影响。

解:程序执行的 CPU 时间=程序执行的时钟周期数×时钟周期时间=(C1+C2)×时钟周期时间=(IC×CPI+ 总访存次数×失效率×Cache 失效开销 )×时钟周期时间=[IC×CPI +IC ×( 总访存次数 /IC)×失效率×Cache 失效开销 ]×时钟周期时间=IC×[CPI +( 总访存次数 /IC)×失效率×Cache 失效开销 ]×时钟周期时间=IC×[CPI + 平均每条指令访存次数×失效率×Cache 失效开销 ]×时钟周期时间有 cache ,则上式 =IC×[2+1.33×2%×50]×时钟周期时间 =IC×3.33×时钟周期时间无 cache ,则上式 =IC×[2+1.33×100%×50]×时钟周期时间 =IC×68.5×时钟周期时

间可以看出, Cache 的存在,将平均 CPI 从 68.5减少到 3.33 ,程序加速了约 20倍。解毕。

42/91▲

5.2 Cache 的基本知识

4. Cache 失效开销中的 Amdahl定律 由前例可知,程序执行的 CPU 时间

=程序执行的时钟周期数×时钟周期时间=IC×实际 CPI×时钟周期时间实际 CPI= 理想 CPI + 平均每条指令访存次数×失效率×Cache 失效开销

理想 CPI 越低, Cache 失效开销在实际 CPI 中所占的比例越大,即相对影响越大

Cache 失效开销时间 =CPU等待数据而停顿的周期数 C2×时钟周期时间 内存硬件一旦确定, Cache 失效开销时间就确定了,因此 C2 和时钟周期

时间形成反比关系,即时钟周期时间越短(时钟频率越高), C2 中含有的时钟周期数越多。换句话说:

时钟频率越高, Cache 失效开销在实际 CPI 中所占的比例越大,即相对影响越大

因此, Cache 对于低 CPI、高时钟频率的 CPU 来说更加重要。 那么,是不是平均访存时间越短, CPU 的执行时间就越短呢?

例子见下页

43/91▲

5.2 Cache 的基本知识

例 5.3 比较直接映象 Cache 和 2路组相联 Cache 对 CPU 的性能的影响。假设:

(1) 两种 Cache 容量均为 64KB ,块大小都是 32 字节,命中时间为 1 个时钟周期,失效开销都是 70 ns 。

(2) 直接映象 Cache 的失效率为 1.4%, 2路组相联 Cache 的失效率为 1.0%。

(3) 理想 Cache(命中率为 100%)情况下的 CPI 为 2.0 ,时钟周期为 2ns ,平均每条指令访存 1.3 次。

(4) 在 n- 路组相联 Cache 中,必须增加一个 n:1多路选择器,用于根据标识匹配结果从相应组的块中选择所需的数据。对于组相联 Cache ,由于多路选择器的存在而使 CPU 的时钟周期增加到原来的 1.1倍。 2- 路组相联Cache 中的 2:1多路选择器见下页图。

先求平均访存时间,然后再计算 CPU 性能。

44/91▲

5.2 Cache 的基本知识

45/91▲

5.2 Cache 的基本知识

解: 先计算平均访存时间 T =命中时间+失效率×失效开销

T1路= 2.0+( 0.014×70)= 2.98 ns

T2路= 2.0×1.1+( 0.010×70)= 2.90 ns

再计算程序执行的 CPU 时间=IC×[CPI +( 总访存次数 /IC)×失效率×Cache 失效等待周期数 ]×时钟周期时

间=IC×[CPI×时钟周期时间 +( 总访存次数 /IC)×失效率×Cache 失效等待周期

数×时钟周期时间 ]=IC×[CPI×时钟周期时间 +( 总访存次数 /IC)×失效率×Cache 失效开销时间 ]

CPU 时间 1路 = IC×[2.0×2+ (1.3×0.014×70)] = 5.27×IC

CPU 时间 2路 = IC×[2.0×2×1.10+ (1.3×0.010×70)] = 5.31×IC

2路组相联 Cache平均访存时间较短, CPU 的执行时间却较长。Cache设计时,要以减少 CPU 的执行时间为最终目标。解毕。

46/91▲

Cache 性能优化的出发点:平均访存时间=命中时间+失效率×失效开销

由上式可知,能够从三个方面改进 Cache 的性能: 降低 Cache 失效率(重点介绍) 减少 Cache 失效开销(略) 减少 Cache 命中时间(略)

5.3 Cache 性能优化

47/91▲

1. Cache 失效的分类 强制性失效 (Compulsory miss) (冷启动失效 /首次访问失

效 ) 当第一次访问一个块时,该块不在 Cache 中,需从下

一级存储器中调入 Cache 。 容量失效 (Capacity miss )

如果程序执行时所需的块不能全部调入 Cache 中,则当某些块被替换后,又重新被访问。如果单个 cache块足够大,则不存在容量失效。

冲突失效 (Conflict miss) (碰撞失效,干扰失效 ) 在组相联或直接映象 Cache 中,若太多的块映象到同

一组 ( 块 ) 中,则会出现该组中某个块被别的块替换( 即使别的组或块有空闲位置 ) ,然后又重新被访问。

5.3 Cache 性能优化

48/91▲

5.3 Cache 性能优化

2. 三种失效所占的比例

49/91▲

5.3 Cache 性能优化

关于失效率的经验规则: 相联度越高,冲突失效就越少;全相联降低主频 强制性失效和容量失效不受相联度的影响; 强制性失效不受 Cache 容量的影响,但容量失效却

随着容量的增加而减少; 大小为 N 的直接映象 Cache 的失效率约等于大小为

N/2 的 2路组相联 Cache 的失效率。

50/91▲

5.3 Cache 性能优化

降低 Cache 失效率的典型方法 增加块大小(减少强制性失效) 提高相联度(减少冲突失效) 增加 Cache 总容量(减少容量失效) Victim Cache(减少冲突失效) 伪相联映像 Cache 硬件预取 编译器 / 程序 控制的预取 编译器 / 程序 优化

许多降低失效率的方法会增加命中时间或失效开销平均访存时间=命中时间+失效率×失效开销

51/91▲

5.3 Cache 性能优化

对于给定的 Cache 容量,当块大小增加时,失效率开始是下降,后来反而上升。因为增加 Cache 块大小虽然利用空间局部性减少了强制性失效,但也减少了 Cache 块的数目,可能增加冲突失效。

Cache 容量越大,使失效率达到最低的块大小就越大。

A. 增加 Cache 块大小 块大小

(字节)

Cache 容量(字节)

1K 4K 16K 64K 256K

16 15.05

%

8.57% 3.94% 2.04% 1.09%

32 13.34

%

7.24% 2.87% 1.35% 0.70%

64 13.76

%

7.00% 2.64% 1.06% 0.51%

128 16.64

%

7.78% 2.77% 1.02% 0.49%

256 22.01

%

9.51% 3.29% 1.15% 0.49%

52/91▲

5.3 Cache 性能优化

增加块大小会增加失效开销例 5.4 假定存储系统在延迟 40 个周期后,每 2 个周期能送出 16 个字节。即,经过 42 个周期,它可提供 16 个字节;经过 44 个周期,可提供 32个字节;依此类推。假定命中时间为 1 个周期。请问对于下表中列出的各种容量的 Cache ,在不同 Cache 块大小情况下的平均访存时间。

块大小

(字节)

Cache 容量(字节)

1K 4K 16K 64K 256K

16 15.05

%

8.57% 3.94% 2.04% 1.09%

32 13.34

%

7.24% 2.87% 1.35% 0.70%

64 13.76

%

7.00% 2.64% 1.06% 0.51%

128 16.64

%

7.78% 2.77% 1.02% 0.49%

256 22.01

%

9.51% 3.29% 1.15% 0.49%

53/91▲

5.3 Cache 性能优化

解 :(1) 根据 Cache 块大小计算 Cache 的失效开销,即传送一个 Cache

块所用的时钟周期数:延迟 40 个时钟周期后,每 2 个时钟周期能送出 16 个字节,则传送大小为 X的 cache 块,需要 40+ (X/16)×2 个时钟周期。

(2) 用不同的失效开销和失效率计算平均访存时间平均访存时间 = 命中时间 + 失效率×失效开销

解毕。

54/91▲

5.3 Cache 性能优化

8 路组相联的失效率和全相联接近,所以采用相联度超过 8的方案的实际意义不大。

2:1 Cache经验规则 容量为 N 的直接映象 Cache 的失效率和容量为 N/2

的 2路组相联 Cache 的失效率差不多相同。 提高相联度会增加 Cache 查询匹配的时间,即

命中时间

B. 提高相联度

55/91▲

5.3 Cache 性能优化

降低失效率的最直接方法 会增加硬件成本 可能增加命中时间 多用在二级,三级 Cache

C. 增加 Cache 总容量

56/91▲

5.3 Cache 性能优化

在 Cache 和下一级存储器之间增加一个全相联的小 Cache ,用于存放最后被替换出去的块 (称为 Victim) ,以备重用。

该方法能减少冲突失效而又不影响时钟频率。特别是对于小容量的直接映象数据 Cache ,作用尤其明显。

例如,项数为 4 的 Victim Cache 能使 4 KB Cache 的冲突失效减少 20%~ 90%

D. Victim Cache

57/91▲

5.3 Cache 性能优化

1. 多路组相联的低失效率和直接映象的命中速度

2. 伪相联 Cache同时综合以上两者的优点 命中时间小 失效率低

E. 伪相联 Cache

优 点 缺 点直接映象组相联

命中时间小命中时间大失效率高

失效率低

58/91▲

5.3 Cache 性能优化

3. 基本思想及工作原理 硬件以直接映像 Cache 为基础,将所有 cache 块平分入两个

区,一个主区,一个副区。主区和副区的 cache 块一一对应。 当 CPU发来访存指令, Cache先查询主区对应该地址的 Ca

che 块是否命中,若命中则发生正常命中,从主区该块中取数据返回给 CPU ,否则查询副区中唯一对应的 Cache 块是否命中,若命中则发生伪命中,从副区该块中取数据返回给CPU然后将主副区 Cache 块中的数据互换。

主副区的对应 cache 块均未命中,则访问下一级存储器,将数据调入副区 Cache 块,然后从副区 Cache 块中取数据返回给 CPU ,接着将主副区 Cache 块中的数据互换。

正常命中又称快速命中,伪命中又称慢速命中。数据互换机制就是要保证绝大多数命中都是快速命中。不过多种命中时间导致 CPU流水线设计复杂化。

59/91▲

5.3 Cache 性能优化

例 5.6 已知直接相联和 2路组相联的失效率和失效开销,如何计算伪相联 Cache 的性能?

解 :

假设直接 cache 命中 1 个周期,伪命中多用 2 个周期,无命中多 50 个周期

平均访存时间伪 = W1*T1 + W2*T2 + W3*T3

第一种情况:主区命中,W1 = H1路 = 1-F1路; T1 = 1

第二种情况:副区命中,W2 = H2路 - H1路= (1 - F2路 ) - (1 - F1路 ) = F1路 -F

2路; T2=1+2=3 ;

第三种情况:无命中, W3 = F2路; T3=1+2+50=53如何转换成书上的公式?平均访存时间伪相联=命中时间 1路+ ( 失效率 1路-失效率 2路 )×2+失效率 2路×

失效开销 1路

解毕。

60/91▲

5.3 Cache 性能优化

指令和数据都可以在 CPU 请求访问前进行预取。例如,在将被请求指令所在的指令集合(指令块)调入Cache 时,对下一个指令集合进行预取。

预取内容既可放入 Cache ,也可放在其他介于 CPU与 Memory 之间的缓冲器中。与数据 / 指令 Cache相对应,缓冲器也可以是数据缓冲器,指令缓冲器,或者数据指令协同缓冲器。

硬件预取能够提高数据或指令的命中率,其作用部分相当于增加 Cache 容量,部分相当于两级 Cache 。

F. 硬件预取

61/91▲

5.3 Cache 性能优化

例 5.7 采用指令预取技术的 CPU ,指令 Cache 的失效率 2%,命中时间 1个时钟周期;预取缓冲器的命中率 25%,访问开销为 2 个时钟周期,内存访问开销为 50 个时钟周期。比较预取机制开启和关闭对性能的影响。

解:用 T代表平均访存时间。T预取关闭 = Cache 命中率×Cache 命中时间 + Cache 失效率×(Cache 命中

时间 + 内存访问开销 ) = 98%×1 + 2%×(1+50) = 2T预取开启 = Cache 命中率×Cache 命中时间 + Cache 失效率×Buffer命中率×( Cache 命中时间 +Buffer访问开销) + Cache 失效率×Buffer失效率×( Cache 命中时间 +Buffer访问开销 + 内存访问开销)= 98%×1 + 2%×25%×(1+2) + 2%×75%×(1+2+50) = 3.275

解毕。可以看出,预取缓冲器和 victim Cache 以及伪相联的工作原理非常相似。

62/91▲

5.3 Cache 性能优化

思想:在编译时向代码中加入数据预取指令,在数据被用到之前由预取指令发出预取请求。

目的:使执行指令和读取数据能重叠执行。 类型:

寄存器预取:把数据取到寄存器中。 Cache预取:只将数据取到 Cache 中。 故障性预取:预取时,若出现虚地址故障或违反访问权限,立即产生异常。

非故障性预取:预取时,若出现虚地址故障或违反访问权限,并不会产生异常,只是将预取转变为空操作。

循环是预取优化的主要对象 失效开销小时,循环体展开 1~ 2 次,否则展开多次。

G. 编译器 /程序 控制的数据预取

63/91▲

5.3 Cache 性能优化

思想:程序中的某些过程可以重新组织而不影响程序的正确性。对这样的程序,在编译时对程序中的指令和数据进行重新组织,通过提升时间局部性和空间局部性作用而降低 Cache 失效率,在一个数据块被从 Cache 替换出去之前,最大限度利用其中的数据 ( 访问次数最多 ) 。

无须改动或增加硬件便可以增加失效率。是一种面向硬件行为特征进行纯软件优化的方法,所涉及的技术未必完全依靠编译器,有时还需要程序员在代码设计时直接使用。

典型技术 数组合并 内外循环交换 循环融合 分块

H. 编译器 /程序 优化

64/91▲

5.3 Cache 性能优化

1. 数组合并/* 修改前 */

int val [SIZE]; //val[0] 与 val[1]位于同一 cache 块

int key [SIZE]; //key[0] 与 key[1]位于同一 cache 块

// val[0] 与 key[0] 未必位于同一 cache 块,联合调用容易产生瓶颈。

/* 修改后 */struct merge {

int val;int key;

} ;struct merge merged_array [SIZE];

// merged_array[0].val 与merged_array[0].key位于同一 cache 块,瓶颈消除。

65/91▲

5.3 Cache 性能优化

2. 内外循环交换

/* 修改前 x[1][0], x[2][0], x[3][0]间隔存放,相继被访问 */for ( j = 0 ; j < 100 ; j = j+1 )

for ( i = 0 ; i < 5000 ; i = i+1 )x [ i ][ j ] = 2 * x [ i ][ j ];

/* 修改后 x[0][1], x[0][2], x[0][3] 连续存放,相继被访问 */for ( i = 0 ; i < 5000 ; i = i+1 )

for ( j = 0 ; j < 100 ; j = j+1 )x [ i ][ j ] = 2 * x [ i ][ j ];

66/91▲

5.3 Cache 性能优化

3. 循环融合/* 修改前 */for ( i = 0 ; i < N ; i = i+1 )

for ( j = 0 ; j < N ; j = j+1 )a [ i ][ j ] = 1/ b [ i ][ j ] * c [ i ][ j ];

for ( i = 0 ; i < N ; i = i+1 )for ( j = 0 ; j < N ; j = j+1 )

d [ i ][ j ] = a [ i ][ j ] + c [ i ][ j ];

/* 修改后 */for ( i = 0 ; i < N ; i = i+1 )

for ( j = 0 ; j < N ; j = j+1 ) {a [ i ][ j ] = 1/ b [ i ][ j ] * c [ i ][ j ];d [ i ][ j ] = a [ i ][ j ] + c [ i ][ j ];

}

67/91▲

5.3 Cache 性能优化

4. 分块

68/91▲

5.3 Cache 性能优化

X = Y * Z ( size 均为 N*N )

/* 分块前 */

for (i= 0; i < N; i= i+ 1)

for (j= 0; j < N; j= j+ 1)

{

r= 0;

for (k= 0; k < N; k= k+ 1)

{r = r + y[i][k]*z[k][j];}

x[i][j]= r;

}

一旦 i 与 j固定, k的循环体中需访问一次 y,一次 z,因此为 2N 次访问,加上 k 循环结束的一次 x 写入,共 2N+1 。最坏情况没有 cache 命中,即,N*N*(2N+1)=2N^3+N^2 。

若 cache 中能装下一列 z和一行 y,则存储器访问可以大大减少,问题是,如果 N很大, cache 中不能容得下一个行或一个列。

69/91▲

5.3 Cache 性能优化

70/91▲

5.3 Cache 性能优化

/* 分块后 */for (jj= 0; jj < N; jj= jj+ B) for (kk= 0; kk < N; kk= kk+ B) // 大循环开始 for (i= 0; i < N; i= i+ 1)

// 小循环开始 for (j= jj; j < min(jj+ B,N); j= j+ 1)

{r= 0;for (k = kk; k<min(kk + B,N); k = k+ 1)

{r+=y[i][k]*z[k][j];}x[i][j]+= r;}

// 小循环结束

// 大循环结束

( 1)引入 BxB子数组计算后,整个计算被分成 (NxN)/(BxB) 次大循环。每个大循环体又根据 i 被分成了 N 次小循环。

( 2)每个小循环体中, j 从 jj 到 jj+B , k从 kk到 kk+B ,循环 BxB 次。这 BxB 次循环中,每次计算一个 y*z,但是从 y中取 B 个值,从 z中取 B 个值,然后混合算,因为 cache 容量大于 2B ,因此这 B*B 次的计算只有首次取值需要访存,因此将访问次数从 2xBxB 次降低到 2B 次。乘回去 2B*N* (NxN)/(BxB)=2N^3/B

( 3)每个小循环体中,有 B 次对 X矩阵的访问,只有第一次需要访存,接下来 B-1 次都命中,即 1 次访存。乘回去 1*N*(NxN)/(BxB)=N^3/B 。两者相加, 3N^3/B 次 cache 失效对比分块前的 2N^3+N^2 次,(3N^3/B) / (2N^3+N^2) = 1.5/B 。因为 B 通常远大于 2 ,因此比值远小于 1 ,所以总体上减少了 cache 失效次数,即内存访问次数。

71/91▲

主存的主要性能指标:延迟和带宽 假设基本存储器结构的性能为:

送地址需要 4 个时钟周期 每个字( 32 位)的访问时间为 24 个时钟周期 内存与 Cache 块之间每次数据传送只能处理一个字( 32 位),传送一个字的数据需 4 个时钟周期

假设 Cache 块大小为 4 个字,则一个 Cache 块失效的延迟开销为 4×(4+ 24+ 4) = 128 个时钟周期

存储器的带宽为 4×4B/128 个时钟周期 = 0.125 BPC Byte Per Cycle

本节讨论几种能提高主存性能的存储器组织技术

5.4 主 存

72/91▲

5.4 主 存

1. 增加存储器的宽度 增加 Cache 和存储器的处理宽度,并用多路选择器来接口单字宽的 CPU 和多字宽的存储系统间的差异。

优点:增加带宽,减少延迟 当宽度为 4 时, 延迟 4×(4+ 24+ 4) 减少为 1×(4+ 24+ 4)

带宽 0.125BPC增加为 4×4B/32=0.5BPC

缺点:增加硬件 / 实现代价 增加连接通路 增加数据访问控制逻辑 增加多路选择器

73/91▲

5.4 主 存

2. 采用多体交叉存储器 在存储系统中采用多个存

储体 (Bank) ,并让多个存储体并行工作。

优点:通过减少延迟来增加带宽

当 4 个 Bank同时工作, 延迟 4×(4+ 24+ 4) 减少为 4+ 24+ 4×4

带宽 0.125BPC增加为4×4B/44=0.4BPC

缺点: 只能优化顺序地址的访

问性能。

74/91▲

5.4 主 存

0

16

32

48

地址 体 0 4

20

36

52

地址 体 1 8

24

40

56

地址 体 212

28

44

60

地址 体 3

多体按字交叉 顺序地址是按字交叉分布到各个存储体中的。 内存按字节寻址,交叉度 n 即存储体个数 多个体同时共享一个字宽的地址总线(即从同一个内存控制器获得地址) 多个体分时共享一个字宽的数据总线 按字交叉常适合于处理: Cache读失效( Cache 块大小等于 n 个字)以

及替换写回法 Cache 中的写回动作。

75/91▲

5.4 主 存

多体按字交叉存储器的工作原理

内存控制器

存储体

地址

字 字 字 字字 字 字 字

字 字 字 字字 字 字 字

多路选择器

存储体 存储体 存储体

地址

地址

地址

数据

数据

数据

数据

数据总线

地址总线

76/91▲

5.4 主 存

例 5.14 假设某台计算机的特性如下:

(1) Cache 块大小为 1 个字;

(2) 存储器与 Cache 间总线宽度为 1 个字;

(3) Cache 失效率为 3%;

(4) 平均每条指令访存 1.2 次;

(5) Cache 失效开销为 32 个时钟周期( 4+24+4);

(6) 平均 CPI(忽略 Cache 失效)为 2 。

(7) Cache 块大小变为 2 个字时,失效率降为 2%;块大小变为 4个字时,失效率降为 1%。

(8) 假设不同的情况下,时钟周期时间和指令条数保持不变。

问 :在采用 2路、 4路多体交叉以及将存储器和总线宽度增加一倍时,性能分别提高多少?

77/91▲

5.4 主 存

解 : 当 Cache 块大小为 1 个字时,

Cache 块的失效开销为 4+24+4= 32 CPI 为 2+ 1.2×3%×32 = 3.15

当 Cache 块大小为 2 个字时 32 位总线和存储器,不采用多体交叉

Cache 块的失效开销为 2×(4+24+4) = 64 CPI 为 2+ 1.2×2%×64 = 3.54

32 位总线和存储器,可采用 2路多体交叉 Cache 块的失效开销为 4+24+4×2 = 36 CPI 为 2+ 1.2×2%×36 = 2.86 性能提高了 10%

64 位总线和存储器,不采用多体交叉: Cache 块的失效开销为 4+24+4 = 32 CPI 为 2+ 1.2×2%×32 = 2.77 性能提高了 14%

78/91▲

5.4 主 存

当 Cache 块大小为 4 个字时 32 位总线和存储器,不采用多体交叉

Cache 块的失效开销为 4×(4+24+4) = 128 CPI 为 2+ 1.2×1%×128 = 3.54

32 位总线和存储器,可采用 4路多体交叉 Cache 块的失效开销为 4+24+4×4 = 44 CPI 为 2+ 1.2×1%×44 = 2.53 性能提高了 25%

64 位总线和存储器,不采用多体交叉: Cache 块的失效开销为 2×(4+24+4) = 64 CPI 为 2+ 1.2×1%×64 = 2.77 性能提高了 14%

解毕。

79/91▲

5.4 主 存

内存的构成 一条内存通常由多块内存芯片构成,每个芯片有固定容量和固定

位宽,由于成本控制考虑,芯片的位宽通常会小于内存系统的工作位宽,这就需要多个芯片并联起来工作。

例如,分别采用两种内存芯片构造一条 64MB 的内存 A芯片,容量为 1Mb ,位宽为 1b

所需芯片个数: 64MB/1Mb=64*8=512 个 每个存储体宽度为 1 个字 (32bit) ,由于芯片位宽 1b ,所以需要 3

2 块芯片并联才能构成一个体。 内存中最多可以支持 512/32=16 个体,因此可以构成 2/4/8/16路多体交叉

B芯片,容量为 16Mb ,位宽为 4b 所需芯片个数: 64MB/16Mb=4*8=32 个 每个存储体宽度为 1 个字 (32bit) ,由于芯片位宽 4b ,所以需要 8

块芯片并联才能构成一个体。 内存中最多可以支持 32/8=4 个体,因此可以构成 2/4路多体交叉

80/91▲

5.4 主 存

3. 独立存储体 多个体不再共享同一个内存控制器,而是多个体共享多个独立的内存控制器,能同时进行多个独立的访存。

一台输入设备可能会使用某个 MC 访问某个存储体; Cache读操作可能在使用另一个 MC读另一个存储体; Cache 写操作可能在使用第三个 MC 写第三个存储体。

每个体需要有独立的地址线和独立的数据总线。 多体交叉: m 个体 1 个 MC ,一个字宽的地址总线,一个字宽的数据总线

独立存储体: m 个体m 个 MC , m 个字宽的地址总线, m个字宽的数据总线

独立存储体技术和多体按字交叉可以结合使用。 将存储器分为若干个独立的存储超体 每个存储超体内部又划分为多个按字交叉工作的体。

81/91▲

5.4 主 存

数据总线

存储体

字 字 字 字字 字 字 字

字 字 字 字字 字 字 字

存储体 存储体 存储体

数据

数据

数据

数据

MC MC MC MC

地址总线地址

地址

地址

地址

数据总线

数据

数据

数据

数据

MC MC MC MC

地址总线

地址

地址

地址

地址

存储超体

字字

字字

数据

字字

字字

数据

地址

字字

字字

数据

字字

字字

数据

多路选择器

存储超体

字字

字字

数据

字字

字字

数据

地址

字字

字字

数据

字字

字字

数据

多路选择器

存储超体 存储超体

82/91▲

5.4 主 存

4. 存储体冲突( Bank Conflict )的产生与避免 体冲突:每个体对应一个独立的内存控制器,同时进行多个独立的访存,但是两个或两个以上的并行独立访存请求要访问同一个存储体中的不同地址,并行访存降格为串行访存。

一台输入设备要使用 MC0 访问存储体 1 的地址 20 ; Cache读操作要使用 MC1读存储体 1 的地址 52 ; Cache 写操作要使用 MC3 写存储体 1 的地址 36 。

0

16

32

48

地址 体 0 4

20

36

52

地址 体 1 8

24

40

56

地址 体 212

28

44

60

地址 体 3

83/91▲

5.4 主 存

无论存储系统中细分了多少个存储体,还是很容易发生多个并行访存会对应到同一个存储体的情况,要解决这个问题,就要优化可能同时访存的各个地址的分布。

问题实例 二维数组 X[4x4],正常情况下按一维存放,如果存储器体的个数

为 2 的幂次,则数组按列并发访问时,会有多个待访问地址落在同一个体内。

X[0][0], X[0][1], X[0][2], X[0][3], X[1][0], X[1][1], X[1][2], X[1][3], X[2][0], X[2][1], X[2][2], X[2][3], X[3][0], X[3][1], X[3][2], X[3][3].

解决方法 循环内外交换优化 扩展数组的大小,使之不是 2 的幂 设置体的总个数为素数,最好是 2 的幂减 1

84/91▲

5.4 主 存

循环内外交换优化 For ( j=0 ; j++ , j<n) For ( i=0 ; i++ , i<n) X[i][j]+=… 按行存储按列访问

For ( i=0 ; i++ , i<n) For ( j=0 ; j++ , j<n) X[i][j]+=… 按行存储按行访问

存储模式和访问模式的一致性

85/91▲

5.4 主 存

扩展数组的大小,使之不是 2 的幂 二维数组 X[4x4],扩展成 二维数组 X[4x5],

X[0][0], X[0][1], X[0][2], X[0][3], X[0][4], X[1][0], X[1][1], X[1][2], X[1][3], X[1][4], X[2][0], X[2][1], X[2][2], X[2][3], X[2][4], X[3][0], X[3][1], X[3][2], X[3][3], X[3][4].

按列访问导致多个体的并行读取

86/91▲

5.4 主 存

扩展或缩减硬件中体的个数,使之不是 2 的幂 当体的个数非 2 的幂减 1 时,采用顺序交叉

体号 = 地址 mod 存储体的总个数 体内存储单元的序号(即体内地址) = 地址 /

存储体的总个数 当体的个数为为 2 的幂减 1 时,上面的除法计算可

以用取模计算代替,速度更快,便于硬件实现 体号 = 地址 mod 存储体的总个数 体内存储单元的序号(即体内地址) = 地址

mod 每个存储体中的总字数

87/91▲

5.4 主 存

体 内 地 址

存储体 体号均用 地址 mod 存储体的总个数 来计算顺序交叉: 地址 /体数 3 取模交叉: 地址 mod 体字数 8

0

1

2

3

4

5

顺序交叉和取模交叉的地址映象举例

6

7

Bank0 Bank1 Bank2

0 1 2 0 16 8

3 4 5

6 7 8

9 10 11

12 13 14

21 22 23

15 16 17

18 19 20

9 1 17

18 10 2

3 19 11

12 4 20

21 13 5

6 22 14

15 7 23

Bank0 Bank1 Bank2

88/91▲

5.4 主 存

5. DRAM专用交叉结构的性能优化 DRAM 特性:对 DRAM 的访问分为行访问和列访

问,必须先进性行访问,数据存于行缓冲器,再对行缓冲器进行列访问,行缓冲器可以反复随机读取

利用行缓冲器进行性能优化 Nibble 方式 :每次进行行访问时, DRAM除能够给出所需的位以外,还能给出其后的 3 位。

Page 方式:通过改变列地址,可以随机地访问缓冲器内的任一位。应用最为广泛。

Static column 方式: 和 Page 方式类似,只是在列地址改变时,无需触发列访问选通线。

89/91▲

基本原理:在系统软件和辅助硬件的帮助下,将内存和硬盘组成的存储空间以内存的形式暴露给程序员,使得程序空间可以大于物理内存的大小。

特点 多个进程可以共享远大于实际物理容量的主存空间 程序员不必做存储管理工作,页面调度由 OS处理 采用”起始地址 + 偏移”的动态再定位,简化程序的装入

分类 页式虚拟存储(定长) 段式虚拟存储(变长) 段页式虚拟存储

5.5 虚拟存储器

90/91▲

有关虚拟存储器的四个问题 映象规则:

如果内存页面失效,就要进行磁盘访问替换内存页面,磁盘访问的开销太大,所以降低失效率是根本,因此页面调度采用全相联映象规则。

查找算法: 程序中使用的地址为虚拟地址,通过查询 TLB 或页表,

将虚拟地址翻译为物理地址,再使用物理地址进行访问。 替换算法:

LRU ,选择最近最少使用的页面进行替换 写策略:

替换写回法,修改过的页面用 DirtyFlag 标出。 不能用写直达,因为磁盘访问开销太大了。

91/91▲

5.5 虚拟存储器

地址变换缓冲器 TLB(快表) TLB 是一个特殊的 Cache ,利用局部性原理缓冲最近

使用的页表项; 也分为指令 TLB 和数据 TLB TLB 一般比 CacheLookupTable 更小、更快 VF 有效位, RW读写权

物理页号虚页号VF

物理页号虚页号VF

物理页号虚页号VF

物理页号虚页号VF

物理页号虚页号VF

物理页号虚页号VF

物理页号虚页号VF

物理页号虚页号VF

物理页号快表

虚页号

多路选择器

页表

虚页号 页内位移

物理页号 页内位移

物理地址

RW

RW

RW

RW

RW

RW

RW

RW