编程基础(四)——cache之一
目录
一、概述
二、原理
2.1 局部性原理(principle of locality)
2.2 Memory Hierarchy
2.3 性能评估
三、cache的基本要素
3.1 cache的组成
3.1.1 利用hash表理解cache参数和行为
3.2 cache的分类
3.3 cacheline size
3.4 cache hit & cache miss
3.5 replacement policy
3.6 write policy
3.7 split caches & unified caches
3.8 多级cache管理策略
四、cache coherency
4.1 cache coherency protocal
4.2 store buffer & store forwarding
五、参考
一、概述
本文主要是对缓存知识的梳理,备忘。
二、原理
2.1 局部性原理(principle of locality)
- Temporal if data is accessed, likely to be accessed again soon
- Spatial if data is accessed, likely to access nearby data
2.2 Memory Hierarchy
2.3 性能评估
- AMAT = hit time + miss rate * penalty
三、cache的基本要素
3.1 cache的组成
一个典型的cache如下图所示:
- 一个cache有2^(bits of index) set,每个set包括n个(n-ways) cacheline,每个cacheline 由 tag,data和一些标记位组成,。
- 一个cache 查找的过程使用地址中的index匹配set,在set中使用地址中的tag匹配cacheline,如果找到,称为cache hit,最后使用地址中的offset在cacheline中的相应偏移处取出数据
3.1.1 利用hash表理解cache参数和行为
可以把cache理解成软件上的hash表:
- s个slot, 使用链(set)解决冲突的hash结构,每个链有n个cacheline
- 利用hash_func定位hash slot:这里使用index来定位set
- 利用链表解决冲突:利用地址的中tag和set中每一个cacheline进行匹配
- 一般的,status bit 中比较重要的有V(valid)标识该cacheline是否有效,D(Dirty)标识该cacheline是否被修改过
3.2 cache的分类
在3.1 中,如果每个set只有一个cacheline,类比于hash冲突链最多允许有一个cacheline,称为直接相连(direct-mapped) cache,如果只有一个set,类比于只有一个hash slot,称为全相连(fully-associative) cache, 最后一种情况如上面图中显示的那样,称为n路组相连(n-way set-associative) cache
如我们有如下cpu 的缓存规格:
L1 Data cache = 32 KB, 64 B/line, 8-WAY. (https://www.7-cpu.com/cpu/Broadwell.html)
那么可以知道整个L1 data cache的大小:32K,每个set 8个cacheline,每个cacheline储存64Bytes数据,那么set大小就是32K/8/64=64,从而知道地址中index和offset都是log2(64) = 8bit
3.3 cacheline size
cache需要和位于下级的更大且更慢的存储交换数据(每次交换大小是一个cacheline,称为block),cacheline size的大小需要考量,如果很小,假如一个word大小,那么cacheline的metadata开销很高(tag & status),而且不能利用空间局部性。另一方面,cache和其下一级之间传递数据的速度相比访问cache的速率来说,每次传递很少的数据很低效。cacheline也不会太大,一般4-8 words。
3.4 cache hit & cache miss
如果在cacheline中通过tag匹配到数据,称为cache hit,否则称为cache miss,由于cache hit和cache miss都可以由读写触发,组合起来可以有四种:
- read hit
- read miss
- write hit
- write miss
cache miss种类有以下几种:
- compulsory (code) miss 首次访问
- conflict miss 和其他缓存表项冲突了
- capacity miss 缓存没有空间存放
- communication miss
3.5 replacement policy
当出现cache miss时,需要有一定的策略将victim entry替换。
- FIFO
- LRU
- Round-robin
- Random
- Pseudo-LRU
- Spatial
说明一下LRU,先看一张图:
上述是一个set的示意,为了实现LRU,每个cacheline对应一个LRU counter,LRU counter中记录了cacheline的访问情况(假设从0-3,每个counter的值都不一样,3到0表示访问热度依次降低),当一个cacheline被访问,其热度(LRU counter bit)变为3,其余counter热度依次减一(如果已经是0了,仍保持0),当需要替换时,选择热度最低的0并kick out。
3.6 write policy
write miss
- write allocate 先把要写的数据载入到cache中,再写cache。
- no write allocate 直接把要写的数据写入到内存中
write hit
- write through 直写,将内容直接通过memory controller写到内存中,遵循严格的cache和memory的一致性,写入memory耗时,如果频繁的写入可能会导致性能瓶颈
- write back 写回,解决write through的方法,只写对应的cache,将cacheline的dirty标记置位,该行由于缓存替换策略被换出或者被刷新的时候,写回内存,这种方法会引起cache和memory数据的不一致,需要软件和OS方面的关注
对一个write back类型的cache来说,如果cache的内容被修改,需要在cache replacement的时候将cache内容写到内存上,这时候需要引入dirty bit。write back和write allocate设计上经常搭配使用。
3.7 split caches & unified caches
不同功能和cache可以组织在一起,称为unified caches,也可以互相分离,称为split caches,split cache可以提升系统的性能,如当前CPU中都有icache和dcache,以简单的五级流水线为例来解释,在IF和MEM阶段都会访问内存,如果是unified cache,会引起流水线结构冒险,造成流水线stall,将cache分离可以消除该冒险,从而提高流水线的效率
split cache也会造成问题,TODO
3.8 多级cache管理策略
- inclusive:every item in L1 also in L2 simple, but wastes cache space (multiple copies)
- exclusive:item cannot be in multiple levels at a time
exclusive方式可以存储更多数据。当然如果L2大大超过L1的大小,则这个优势也并不是很大了。exclusive要求如果L1 miss L2 hit,则需要把L2 hit的line和L1中的一条line交换。这就比inclusive直接从L2拷贝hit line到L1中的方式多些工作。
inclusive 方式的一个优点是,当外部设备或者处理器想要从处理器里删掉一条cache line时,处理器只需要检查下L2 cache即可。
inclusive 方式的另外一个优点是,越大的cache可以使用越大的cache line,这可能减小二级cache tags的大小。而Exclusive需要L1和L2的cache line大小相同,以便进行替换。如果二级cahce是远远大于一级cache,并且cache data部分远远大于tag,省下的tag部分可以存放数据。inclusive一个缺点是L2中被替换的line,如果L1中有映射,也需要从L1中替换出去,这可能会导致L1的高miss率。
四、cache coherency
4.1 cache coherency protocal
以MESI为例,按照我的理解:
- read/read response
- invalidate/ invalidate ack
- read invalidate/read response & invalidate ack
- write back
上面的图中,可以将M,E看作一个整体,他们的行为大体是一致的,当有write的动作时,状态会指向M/E
其中I->S发read,S->M/E 发invalidate(当然I->M/E 发read invalidate了,途中没有标出),返回也是一样,M->S 收到rcv read时转移,S->I rcv invalidate时转移
M/E的细微差别在于,如果不通过E状态直接转为M状态,是在atomic RMW下产生的。
4.2 store buffer & store forwarding
由于缓存一致性协议是通过消息来传递的,消息传递无法避免延迟,会造成cpu stall:
解决的方法时在cpu和cache之间添加store buffer,cpu可以不关注消息是否返回而直接写入,而这种方法也会引入问题
a = 1;
b = a + 1
可以看到,两条语句时指令相关的,但假如执行a = 1时发生cache miss,发送read invalide同时将1写到store buffer中,其他cpu通过read resp将cpu0的cacheline置为0,这时候执行b=a+1,取出cache中a的值(此时store buffer中改变的a的值还没有flush到对用的cache中)
五、参考
【1】A_survey_on_the_interaction_between_caching_transl.pdf
编程基础(四)——cache之一相关推荐
- 计算机科学与技术学习路线编程基础四大件应用实践编程(含C++学习路线)
计算机科学与技术学习路线&编程基础四大件&应用实践编程(含C++学习路线) 基本介绍 本人211科班出身,目前大学临近毕业,想给迷茫的同行者或者后来人一些建议和推荐,少走弯路.想想自己 ...
- python编程基础(四):编程习惯、代码规范、易混淆之处
目录 编程习惯 代码规范 python中self的作用 易混淆之处 编程习惯 1. 添加主函数if __name__ == 'main': 2. 使用project_path = os.getcwd( ...
- 编程基础 | 四种常见的 POST 提交数据方式
我们在使用post, put, patch, delete, options等方法的时候, 他们都有方法体body, 用来存储数据.而body的类型可以有: form-data.x-www-form- ...
- python编程基础(四):if 语句 增强程序鲁棒性
一. 条件测试 1.判断相等: == 2.使用 and 判断多个条件: 条件均为 true 的时候,才是 true 类似于 && 与 3.使用 or 判断多个条件: 条件有一个 ...
- Linux网络编程基础和一步一步学
·Linux网络编程 基础(一) ·Linux网络编程 基础(二) ·Linux网络编程 基础(三) ·Linux网络编程 基础(四) ·Linux网络编程 基础(五) ·Linux网络编程 基础(六 ...
- 多实例多进程网络编程PHP,php socket网络编程基础知识(四):多进程
标签:status 传递 windows 返回 修改 队列 _for 响应 关联 说明 php在web编程时是不需要考虑多进程的,但整个php流程是涉及到多进程的,只不 ...
- [GO语言基础] 四.算术运算、逻辑运算、赋值运算、位运算及编程练习
作为网络安全初学者,会遇到采用Go语言开发的恶意样本.因此从今天开始从零讲解Golang编程语言,一方面是督促自己不断前行且学习新知识:另一方面是分享与读者,希望大家一起进步.前文介绍了Golang的 ...
- linux 脚本编写 -eq,关于shell脚本基础编程第四篇
shell脚本基础编程第四篇 本章主要内容:函数 函数 function: function 名称 { 命令 ; } 或 name () { 命令 ; } 定义 shell 函数. 创建一个以 NAM ...
- 自学Python第十四天- 一些有用的模块:urllib、requests 网络编程基础,向爬虫靠拢
自学Python第十四天- 一些有用的模块:urllib.requests 网络编程基础,向爬虫靠拢 fake_useragent 库 安装 fake_useragent 使用 urllib 库 ur ...
- python程序设计实验指导书第1版实验三十四_《python编程基础》实验指导书.doc
<python编程基础>实验指导书 PAGE 南 阳 理 工 学 院 <python编程基础>实验指导书 (2014版) 软件学院·软件工程教研室 2011.3 目录 TOC ...
最新文章
- 大数据分析中使用关系型数据库的关键点
- Angular Dialog 组件的设计与实现
- module ‘tensorflow‘ has no attribute ‘Tensor‘
- C#使用ICSharpCode.SharpZipLib压缩后进行web批量下载文件
- python while循环和双重循环
- 计算机系统基础:文件的存取和存储空间管理知识笔记
- SqlServer 时间格式化
- vue 中v-if 与v-show 的区别
- Typescript实现单例之父类调用子类
- 我想说:工作没那么难找吧
- rendering omni shadow in one pass.
- 微信的cookie 和 session
- c语言小树苗健康指数,一颗特别的小树苗.doc
- PingFang(苹方)字体的引用
- 从本钢板B看低市盈率投资收益
- Bootstrap颜色对应对照表
- Mq的幂等性问题分析和基本处理
- 一、多媒体技术的基础本章小结
- MVC3.0中直接在VS中浏览cshtml页面
- Qt实现小球碰撞动画——屏保