目录

一、概述

二、原理

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表:

  1. s个slot, 使用链(set)解决冲突的hash结构,每个链有n个cacheline
  2. 利用hash_func定位hash slot:这里使用index来定位set
  3. 利用链表解决冲突:利用地址的中tag和set中每一个cacheline进行匹配
  4. 一般的,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之一相关推荐

  1. 计算机科学与技术学习路线编程基础四大件应用实践编程(含C++学习路线)

    计算机科学与技术学习路线&编程基础四大件&应用实践编程(含C++学习路线) 基本介绍 本人211科班出身,目前大学临近毕业,想给迷茫的同行者或者后来人一些建议和推荐,少走弯路.想想自己 ...

  2. python编程基础(四):编程习惯、代码规范、易混淆之处

    目录 编程习惯 代码规范 python中self的作用 易混淆之处 编程习惯 1. 添加主函数if __name__ == 'main': 2. 使用project_path = os.getcwd( ...

  3. 编程基础 | 四种常见的 POST 提交数据方式

    我们在使用post, put, patch, delete, options等方法的时候, 他们都有方法体body, 用来存储数据.而body的类型可以有: form-data.x-www-form- ...

  4. python编程基础(四):if 语句 增强程序鲁棒性

    一. 条件测试 1.判断相等:  == 2.使用 and 判断多个条件:  条件均为 true 的时候,才是 true 类似于 &&  与 3.使用 or 判断多个条件:  条件有一个 ...

  5. Linux网络编程基础和一步一步学

    ·Linux网络编程 基础(一) ·Linux网络编程 基础(二) ·Linux网络编程 基础(三) ·Linux网络编程 基础(四) ·Linux网络编程 基础(五) ·Linux网络编程 基础(六 ...

  6. 多实例多进程网络编程PHP,php socket网络编程基础知识(四):多进程

    标签:status   传递   windows   返回   修改   队列   _for   响应   关联 说明 php在web编程时是不需要考虑多进程的,但整个php流程是涉及到多进程的,只不 ...

  7. [GO语言基础] 四.算术运算、逻辑运算、赋值运算、位运算及编程练习

    作为网络安全初学者,会遇到采用Go语言开发的恶意样本.因此从今天开始从零讲解Golang编程语言,一方面是督促自己不断前行且学习新知识:另一方面是分享与读者,希望大家一起进步.前文介绍了Golang的 ...

  8. linux 脚本编写 -eq,关于shell脚本基础编程第四篇

    shell脚本基础编程第四篇 本章主要内容:函数 函数 function: function 名称 { 命令 ; } 或 name () { 命令 ; } 定义 shell 函数. 创建一个以 NAM ...

  9. 自学Python第十四天- 一些有用的模块:urllib、requests 网络编程基础,向爬虫靠拢

    自学Python第十四天- 一些有用的模块:urllib.requests 网络编程基础,向爬虫靠拢 fake_useragent 库 安装 fake_useragent 使用 urllib 库 ur ...

  10. python程序设计实验指导书第1版实验三十四_《python编程基础》实验指导书.doc

    <python编程基础>实验指导书 PAGE 南 阳 理 工 学 院 <python编程基础>实验指导书 (2014版) 软件学院·软件工程教研室 2011.3 目录 TOC ...

最新文章

  1. 大数据分析中使用关系型数据库的关键点
  2. Angular Dialog 组件的设计与实现
  3. module ‘tensorflow‘ has no attribute ‘Tensor‘
  4. C#使用ICSharpCode.SharpZipLib压缩后进行web批量下载文件
  5. python while循环和双重循环
  6. 计算机系统基础:文件的存取和存储空间管理知识笔记
  7. SqlServer 时间格式化
  8. vue 中v-if 与v-show 的区别
  9. Typescript实现单例之父类调用子类
  10. 我想说:工作没那么难找吧
  11. rendering omni shadow in one pass.
  12. 微信的cookie 和 session
  13. c语言小树苗健康指数,一颗特别的小树苗.doc
  14. PingFang(苹方)字体的引用
  15. 从本钢板B看低市盈率投资收益
  16. Bootstrap颜色对应对照表
  17. Mq的幂等性问题分析和基本处理
  18. 一、多媒体技术的基础本章小结
  19. MVC3.0中直接在VS中浏览cshtml页面
  20. Qt实现小球碰撞动画——屏保

热门文章

  1. 突破变态限制快捷方式提权法
  2. Boost-IO学习 异步数据处理Simple(转)
  3. Java并发编程之原子类
  4. Vue.js 关于router传参那点事儿
  5. 程序员春节回家相亲指南
  6. 解决Eclipse出现的Failure to transfer ... jar问题
  7. JSSE Java与SSL
  8. spring3.1 profile 配置不同的环境
  9. socket 和 TCP/IP 协议的关系
  10. matlab-自控原理 已知x~=Ax+Bu中的AB矩阵和X0,求单位输入下的时间响应