第六节:CPU读缓存,写缓存在不同级别的存储器的规律
2012-08-11 13:57
260 查看
本文涉及到的一些术语请参考DSP系列的其他小节。
C64+ DSP的缓存控制器分为 L1P Controler,L1D Controler,L2 Controler,External
Memory Controler(EMC)。L1P 控制器有具备一个寄存器接口,允许用户配置部分或者全部的L1P
RAM 作为一般的RAM 或者作为缓存,同样:L1D 控制器也具有一个寄存器接口,允许用户去配置部分L1D RAM 作为数
据RAM 或者作为缓存,可以配置缓存大小为0K,4K,8K,16K,32K。L2也是一样,因此在L1P,L1D,L2中都有两个区域,
一个是区域0,另一个是区域1.区域0一般作为存储器使用,区域1则作为缓存。知道了这一点,则有利于理解第四节中的存储器体系的关系。
L1P:L1P的特点是,Direct-Mapped Caches和 Read Allocate,即直接映射和读分配。cpu访问时间:1周期。
直接影射型意味着地址和cache之间有显式的对应关系,而读分配则意味着,只有read miss时才会从下一级存储器读取数据来更新缓存。
请看下图:
图1:L1P缓存结构图
图2:L1P 缓存控制器
因为C64+DSP的32位处理器,所以有了图2中的32位的缓存控制器。
图1和图2的对应关系是:
tag ram------tag,表示一个地址的唯一标识。因为不会出现两个相同的18位tag
line frames----set,表示缓存中的某一行。
data,32byte-----offset。表示真正存储数据的偏移位置。
V标志为是缓存结构中的标志信息。表示此缓存是否有效。
图中排(set)段(bits 13-5)标志着此地址会被映射到哪个set(在直接型
缓存中,set 等价于line frame),对于地址0020h,set 段为1.缓存控制器会接着
去检查tag 段18位(bits 31-14)和valid 位。这里我们假设 valid 位是0,控制器就
会注册为miss,也就是说,所请求的地址不在缓存中
大家可以计算一下,理论上,32位地址可以全部在缓存结构中得到映射。
下面讨论L1D:
L1D的特点是:2-way set-associative,Read Allocate, Write-back,Passed through 4 × 64-bit write
buffer. Only stalls when full
意思是:L1D属于典型的两路组set 关联型的缓存,读分配缓存,
回写型缓存:
a:write miss时通过4X64bits的write buffer通道批量向下一级存储器写数据
,当这个write buffer满时,则stall一个周期。
b:write hit时则暂时放在L1D,等合适的时候再写到下级存储器。
L1D存储器结构请看下图:
图3:L1D存储器结构
其实L1D缓存结构与L1P的最大不同是采用了两路结构。并且多了一个D标志位和LRU标志位。
D标志位即dirty,表示此行是否包括最新的数据。
LRU则表示最近最少使用。即最有可能被新缓存占用的。所以这个是决定两路缓存应该使用哪一个的标志。
因此当其中一路有任何状态改变,则就会标记为最近最常使用的。那么下次缓存冲突时便会优先选择另一路。
下面讲述L2
L2的特点是:4-way set-associative,Read and write allocate Write-back
L2属于全能的,即有四路组并联,保证了缓冲容量,也在一定程度上保证了缓存命中率。
可以读分配,并且支持命中回写。可以写分配,支持命中回写。
一种典型的工作场景是:
1,对于程序段而言。当cpu运行时,若需要访问某个指令,则将地址数据拆分,按照规则先从L1P中寻找,假如
找到了,则直接命中返回,只需要一个周期。假如没有找到,则到L2 cache中去找,若L2 cache 找到,则将此
指令更新到L1P的对应位置,则返回给CPU.若L2 cache依然没有找到,则从DDR2去找,找到后,更新L2
cache(注意,更新L2 cache之前,若L2 cache对应位置Line,已经标记为dirty,则要先把此line回写到
DDR2,这就是维持缓存一致性,不过代码段通常不会有这种情况,因为代码段一般是只读的 ),然后更
新L1P cache,然后返回给CPU。
2.对于数据段而言。要分读和写两种情况。
读的情况和代码段基本一致。不同的是。
若L1D中没有数据命中,当L2读命中后,则需要更新L1D,此时需要先判定L1D的对应数据是否需要回
写(即是否标记为dirty)。需要回写则先写到下级存储器L2,若写命中,则暂时放在L2,因为L2也是回写型
的。若L2写失败,则L2会从DDR2中读取一行对于地址的数据,此数据与L1D要回写过来的数据合并更新
后,缓存在L2中(注意缓存之前,肯定也会检查L2此位置是否含有标记为dirty的数据,若有,则先把次数
据写到DDR2中)。
CPU写的情况是这样,若cpu需要向写数据,肯定会先写到L1D,因为L1D是属于读分配,写不分配的,所
以如果写命中了,则会直接更新L1D。因为L1D的回写型的,因此动作到此为止。若L1D写失败,因为写不
分配,所以会从L1D旁边的write bufer通道写到L2。若恰好L2写命中,因为L2是回写型的,所以动作也到此
为止,若L2写失败,则L2会从DDR2中读取一行对于地址的数据,此数据与L1D要回写过来的数据合并更新
后,缓存在L2中(注意缓存之前,肯定也会检查L2此位置是否含有标记为dirty的数据,若有,则先把次数
据写到DDR2中)。
C64+ DSP的缓存控制器分为 L1P Controler,L1D Controler,L2 Controler,External
Memory Controler(EMC)。L1P 控制器有具备一个寄存器接口,允许用户配置部分或者全部的L1P
RAM 作为一般的RAM 或者作为缓存,同样:L1D 控制器也具有一个寄存器接口,允许用户去配置部分L1D RAM 作为数
据RAM 或者作为缓存,可以配置缓存大小为0K,4K,8K,16K,32K。L2也是一样,因此在L1P,L1D,L2中都有两个区域,
一个是区域0,另一个是区域1.区域0一般作为存储器使用,区域1则作为缓存。知道了这一点,则有利于理解第四节中的存储器体系的关系。
L1P:L1P的特点是,Direct-Mapped Caches和 Read Allocate,即直接映射和读分配。cpu访问时间:1周期。
直接影射型意味着地址和cache之间有显式的对应关系,而读分配则意味着,只有read miss时才会从下一级存储器读取数据来更新缓存。
请看下图:
图1:L1P缓存结构图
图2:L1P 缓存控制器
因为C64+DSP的32位处理器,所以有了图2中的32位的缓存控制器。
图1和图2的对应关系是:
tag ram------tag,表示一个地址的唯一标识。因为不会出现两个相同的18位tag
line frames----set,表示缓存中的某一行。
data,32byte-----offset。表示真正存储数据的偏移位置。
V标志为是缓存结构中的标志信息。表示此缓存是否有效。
图中排(set)段(bits 13-5)标志着此地址会被映射到哪个set(在直接型
缓存中,set 等价于line frame),对于地址0020h,set 段为1.缓存控制器会接着
去检查tag 段18位(bits 31-14)和valid 位。这里我们假设 valid 位是0,控制器就
会注册为miss,也就是说,所请求的地址不在缓存中
大家可以计算一下,理论上,32位地址可以全部在缓存结构中得到映射。
下面讨论L1D:
L1D的特点是:2-way set-associative,Read Allocate, Write-back,Passed through 4 × 64-bit write
buffer. Only stalls when full
意思是:L1D属于典型的两路组set 关联型的缓存,读分配缓存,
回写型缓存:
a:write miss时通过4X64bits的write buffer通道批量向下一级存储器写数据
,当这个write buffer满时,则stall一个周期。
b:write hit时则暂时放在L1D,等合适的时候再写到下级存储器。
L1D存储器结构请看下图:
图3:L1D存储器结构
其实L1D缓存结构与L1P的最大不同是采用了两路结构。并且多了一个D标志位和LRU标志位。
D标志位即dirty,表示此行是否包括最新的数据。
LRU则表示最近最少使用。即最有可能被新缓存占用的。所以这个是决定两路缓存应该使用哪一个的标志。
因此当其中一路有任何状态改变,则就会标记为最近最常使用的。那么下次缓存冲突时便会优先选择另一路。
下面讲述L2
L2的特点是:4-way set-associative,Read and write allocate Write-back
L2属于全能的,即有四路组并联,保证了缓冲容量,也在一定程度上保证了缓存命中率。
可以读分配,并且支持命中回写。可以写分配,支持命中回写。
一种典型的工作场景是:
1,对于程序段而言。当cpu运行时,若需要访问某个指令,则将地址数据拆分,按照规则先从L1P中寻找,假如
找到了,则直接命中返回,只需要一个周期。假如没有找到,则到L2 cache中去找,若L2 cache 找到,则将此
指令更新到L1P的对应位置,则返回给CPU.若L2 cache依然没有找到,则从DDR2去找,找到后,更新L2
cache(注意,更新L2 cache之前,若L2 cache对应位置Line,已经标记为dirty,则要先把此line回写到
DDR2,这就是维持缓存一致性,不过代码段通常不会有这种情况,因为代码段一般是只读的 ),然后更
新L1P cache,然后返回给CPU。
2.对于数据段而言。要分读和写两种情况。
读的情况和代码段基本一致。不同的是。
若L1D中没有数据命中,当L2读命中后,则需要更新L1D,此时需要先判定L1D的对应数据是否需要回
写(即是否标记为dirty)。需要回写则先写到下级存储器L2,若写命中,则暂时放在L2,因为L2也是回写型
的。若L2写失败,则L2会从DDR2中读取一行对于地址的数据,此数据与L1D要回写过来的数据合并更新
后,缓存在L2中(注意缓存之前,肯定也会检查L2此位置是否含有标记为dirty的数据,若有,则先把次数
据写到DDR2中)。
CPU写的情况是这样,若cpu需要向写数据,肯定会先写到L1D,因为L1D是属于读分配,写不分配的,所
以如果写命中了,则会直接更新L1D。因为L1D的回写型的,因此动作到此为止。若L1D写失败,因为写不
分配,所以会从L1D旁边的write bufer通道写到L2。若恰好L2写命中,因为L2是回写型的,所以动作也到此
为止,若L2写失败,则L2会从DDR2中读取一行对于地址的数据,此数据与L1D要回写过来的数据合并更新
后,缓存在L2中(注意缓存之前,肯定也会检查L2此位置是否含有标记为dirty的数据,若有,则先把次数
据写到DDR2中)。
相关文章推荐
- CPU的高速缓存存储器知识整理
- CPU的高速缓存存储器的理解
- Log2net频繁记录debug日志到如何区分日志级别到不同文件
- DS8700 的CPU、缓存的选择及配置
- Creating Multiple APKs for Different API Levels 创建多个不同的API级别的APK
- PHP性能优化-编译级别的缓存
- InnoDB 在不同隔离级别下的一致性读及锁的差异
- Log4j按级别输出日志到不同文件配置分析
- Fragment在不同情况下的显示和隐藏的控制(在已有缓存,生命周期不走的情况下)
- [原创]java WEB学习笔记78:Hibernate学习之路---session概述,session缓存(hibernate 一级缓存),数据库的隔离级别,在 MySql 中设置隔离级别,在 Hibernate 中设置隔离级别
- 【汇编语言/底层开发】1、CPU的总线与存储器
- 每个程序员都应该了解的 CPU 高速缓存
- log4j 分级别写入不同的日志文件
- Linux 多核下绑定硬件中断到不同 CPU(IRQ Affinity)
- MySQL数据库的字符集和copy_and_convert 字符集不同导致CPU资源额外消耗
- 如何使用 @ OutputCache 指令的 VaryByCustom 属性来缓存不同版本的页面
- 普通CPU与服务器CPU的不同
- hibernate 缓存 状态 隔离级别 锁
- C4047、间接级别、间接寻址级别不同
- 游戏与显卡、cpu与缓存数据,硬盘与数量,有人说玩绝地求生的显卡是好显卡,并不这样的情况。