stream buffer原理

Stream buffer是一个用于在cache和memory或者L1cache和L2cache之间的预取器,相应地,其目的是用于替代L2cache或者减少L1cache的缺失率

最原始的streambuffer由Jouppi(见参考论文)一个人提出(牛逼吧?论文上也是一个作者),用于在L2和L1cache之间预取数据,后来被Palacharla引申,用于在cache和memory之间预取数据,主要目的是代替L2cache。

一.简单介绍stream buffer原理:

Cache miss后如果在stream buffer中查到了相应的数据,则处理器把这个cache block取到cache中。如果遇到cache写回,则bypass stream直接写回,并且把在stream中对应的数据invalidate掉。

与二级cache对比,streambuffer的硬件逻辑很少,每一个stream buffer需要一个comparator、一个adder、一个小的SRAM用于存储cache block。另外,由于没有RAM查询操作,所以访问stream buffer比访问二级cache快。

由于大部分程序在同一个循环中会访问多个数组,所以可以考虑同时使用多个stream并行预取多组数据。每次发生cache miss,把地址与每个stream的头部tag进行对比,如果命中了其中某个stream,那么就把该cache block预取到cache中。Stream个数少于8个时都不会增加访问时间。

对于streambuffer重要的两个参数是streams的数量和每个stream的深度。深度是指每个stream预取的entry的个数。

Stream buffer的工作过程:为了避免不必要的预取,在stream buffer中使用过滤器(filter),其实现过程是:如果对于cache block的引用i发生了miss,并且对于i+1的引用也发生了miss,那么就分配一个stream用于预取i+2,i+3,等等。其实现过程如下图所示:

1. 保持一个N项的history buffer,其中存放的是最近发生miss的地址的下一个地址,例如a地址发生miss,则把a+1存放到该buffer中。

2. 把每一个在L1cache中发生miss、并且在stream中也miss的地址,与history buffer做比较,如果命中,则说明最近的两次访存是a,a+1,那么很可能接下来a+2,a+3也会被访问,这时候就分配stream用于预取接下来的地址。

3. 如果在historybuffer中没找到对应的地址,那么说明发生miss的地址不是连续的,就把发生miss的地址放入history buffer用于以后的对比。

4. 这个history buffer就是上图中的unit-stride filter。

二,对于非一致的访存进行预取

章节一种讲的是对于访存地址完全连续的情形,有些访存不是完全连续的,有可能是跳跃式但步幅是固定的,比如a+5,a+10,a+15等等。对于此种进行预取的方法是,用有限状态机进行判断,例如下图7。除了多个有限状态机和在filter中多一些标志位,其他都一样,不再赘述。czone用来探测访存在某些地址区间内的热度

Stream buffer的缺点:只考虑cache miss情况,cache 命中的情况不进行预取。事实上cache 命中时也应该考虑预取,比如a地址命中cache,a+1也命中,很可能a+2也会命中。但是根据旧的stream buffer设计,cache命中情况不经过stream,也更不会进入filter。所以添加以下逻辑进行完善:

参考论文:

1. Palacharla,Subbarao, and Richard E. Kessler. “Evaluating Stream Buffers as a SecondaryCache Replacement.” ACM SIGARCH Computer Architecture News 22, no. 2(1994): 24–33.

2. Jouppi, Norman P.“Improving Direct-Mapped Cache Performance by the Addition of a SmallFully-Associative Cache and Prefetch Buffers.” In Computer Architecture,1990. Proceedings., 17th Annual International Symposium on, 364–73. IEEE,1990. http://ieeexplore.ieee.org/xpls/abs_all.jsp?arnumber=134547.

时间: 2024-11-25 20:36:15

stream buffer原理的相关文章

node.js Stream Buffer FsPromise

Stream: 类似这样:a.pipe(b).pipe(c); 我想写一个b.所以: var rs=new (require('stream').Readable)(); var ws=new (require('stream').Writable)(); rs._read=function(){ this.push('send a msn for the first time'); this.push('send a msn for the second time'); this.push(n

[三]java8 函数式编程Stream 概念深入理解 Stream 运行原理 Stream设计思路

Stream的概念定义   官方文档是永远的圣经~ 表格内容来自https://docs.oracle.com/javase/8/docs/api/   Package java.util.stream  一节部分原文内容的翻译 int sum = widgets.stream() .filter(b -> b.getColor() == RED) .mapToInt(b -> b.getWeight()) .sum(); 流操作被划分为中间和终端操作,并组合成流管道. 一条Stream管道由

【转】双缓冲(Double Buffer)原理和使用

原文出自:http://blog.csdn.net/xiaohui_hubei/article/details/16319249 一.双缓冲作用 双缓冲甚至是多缓冲,在许多情况下都很有用.一般需要使用双缓冲区的地方都是由于"生产者"和"消费者"供需不一致所造成的.这样的情况在很多地方后可能会发生,使用多缓冲可以很好的解决.我举几个常见的例子: 例 1. 在网络传输过程中数据的接收,有时可能数据来的太快来不及接收导致数据丢失.这是由于"发送者"和&

双缓冲(Double Buffer)原理和使用

一.双缓冲作用 双缓冲甚至是多缓冲,在许多情况下都很有用.一般需要使用双缓冲区的地方都是由于“生产者”和“消费者”供需不一致所造成的.这样的情况在很多地方后可能会发生,使用多缓冲可以很好的解决.我举几个常见的例子: 例 1. 在网络传输过程中数据的接收,有时可能数据来的太快来不及接收导致数据丢失.这是由于“发送者”和“接收者”速度不一致所致,在他们之间安排一个或多个缓冲区来存放来不及接收的数据,让速度较慢的“接收者”可以慢慢地取完数据不至于丢失.  例2. 再如,计算机中的三级缓存结构:外存(硬

java stream 原理

java stream 原理 需求 从"Apple" "Bug" "ABC" "Dog"中选出以A开头的名字,然后从中选出最长的一个,并输出其长度 1. 最直白的实现 缺点 迭代次数过多 频繁产生中间结果,性能无法接受 2. 平常写法 int longest = 0; for(String str : strings){ if(str.startsWith("A")){// 1. filter(), 保留以

Java8初体验(2):Stream语法详解

原文出处: 一冰_天锦 上篇文章Java8初体验(1):lambda表达式语法比较详细的介绍了lambda表达式的方方面面,细心的读者会发现那篇文章的例子中有很多Stream的例子.这些Stream的例子可能让你产生疑惑,本文将会详细讲解Stream的使用方法(不会涉及Stream的原理,因为这个系列的文章还是一个快速学习如何使用的). 1. Stream初体验 我们先来看看Java里面是怎么定义Stream的: A sequence of elements supporting sequent

MySQL-重做日志 redo log -原理

[redo log buffer][redo log file]-原理 目录: 1.重做日志写入过程图 2.相关知识点汇总图 3.redo_log_buffer 原理 4.redo_log_file 原理 1. 重做日志写入过程: 2. 相关知识点汇总: 3. redo log buffer 原理 重做日志缓冲(redo log buffer)是Innodb存储引擎的内存区域中的一部分. [重做日志信息--(1)-->redo log buffer--(2)-->重做日志文件] 在(2)中涉及

【转】Java8初体验(二)Stream语法详解

原文链接 http://ifeve.com/stream/ Java8初体验(二)Stream语法详解 感谢同事[天锦]的投稿.投稿请联系 [email protected]上篇文章Java8初体验(一)lambda表达式语法比较详细的介绍了lambda表达式的方方面面,细心的读者会发现那篇文章的例子中有很多Stream的例子.这些Stream的例子可能让你产生疑惑,本文将会详细讲解Stream的使用方法(不会涉及Stream的原理,因为这个系列的文章还是一个快速学习如何使用的). 1. Str

mysql-5.7 innodb change buffer 详解

一.innodb change buffer 介绍: 1.innodb change buffer 是针对oltp场景下磁盘IO的一种优化(我也感觉这个不太像人话,但是它又非常的准确的说明 innodb change buffer 的功能) 二.innodb change buffer 原理: 对于insert ,update ,delete 操作一来要更新数据,二来要更新索引:如果要更新的索引页还没有在内存中,那么innodb 不会急于把索引页调入内存,更新,再写回磁盘:它会先把对索引的更新这