微处理器之Trace Cache浅析

问题背景是这样的:随着处理器内流水线越来越长,主频越来越高,分支问题带来的性能损失就越来越明显了。根据统计,分支指令占指令总数的10%(静态),15%(动态)。也就是说平均每处理6~7条指令就出现一条条件转移指令。比如流水线的深度为25,当出现条件转移时,整个流水线都需要被刷新,这个性能损失是难以容忍的。尽管可以采用分支预测等手段来减缓条件转移带来的开销,但并不能彻底解决问题。

我们首先来研究一下分支指令的执行速度:

ExecTime = PredictTime + FailRate * FailPenalty

其中,ExecTime是执行分支指令的速度,PredictTime是预测成功情况下,指令的执行速度。FailRate是预测失败的概率,FailPenalty是分支预测失败时恢复流水线所耗费的时间。FailRate的降低主要依靠提升分支预测的准确率,可以通过在程序里添加一些信息告知编译器那个分支的概率更高点,但是想进一步提高就很困难了。Trace Cache的出现可以降低PredictTime和FailPenalty.

对于X86指令集,译码的时间是非常长的。流水线的大部分工作都是在执行译码,如果能把这部分时间去除或者大幅降低将大幅提高指令的执行速度。从这个角度出发,我们再接着考察实际的程序。事实上,处理器在执行程序的时候总是会处理循环的。这是因为现代处理器可以在1秒内轻易处理10GB以上条指令,如果没有循环,那么这一秒内的程序文件将达到10GB以上,而实际上可执行程序的大小通常是10KB~20MB,也就是说程序中的平均每条指令都需要执行1000次~1000,000次。根据这个观察的结果,如果我们能将1次的译码时间分摊在1000条甚至1000,000条指令上将大幅提升指令的执行速度。

Trace Cache正是基于这个理念实现的,如果把一个窗口内的指令集译码完毕后保存到一个缓冲区中,如果下次再需要执行时,直接从这个缓冲区中读取,不再进行译码将有效降低分支指令预测失败带来的开销。这有两个原因:第一个是可以降低FailPenalty。我们可以宏观的将处理器流水线分为两部分:取指译码部分和执行部分。如果分支预测失败,也只需要将执行部分的流水线清空,而不需要将取指译码部分的流水线清空。第二个原因是降低了PredictTime。这是因为如果分支预测成功了,可以直接从Trace
Cache中加载译码之后产生的微操作(uOp),相当于消除了条件指令在译码流水线上耗费的时间。考虑到条件指令占总指令数量的15%左右,这个提升还是非常可观的。

Trace Cache还能带来其他的好处:

  • 消除指令预取要求的字节对齐。为了充分利用16字节对齐的指令预取要求,函数和循环的入口地址通常需要按照16字节对齐。而Trace Cache中直接加载微操作,这个要求就不需要了。
  • 可以消除译码配对问题。处理器通常将简单指令和复杂指令在不同的部件上执行,为了在执行微操作时充分实现部件之间的全并行,编译器在优化时需要按照一定的模式对译码后的微操作进行配对。而Trace Cache中直接加载的就是微操作,不需要再进行配对。

Trace Cache虽然有很多优点,但是其最大的缺点就是缓冲区耗费的空间比较大。占用较多的芯片面积,随着集成技术的进步,这个问题将会慢慢有所改观。

参考:http://memcache.drivehq.com/memparam/Bench/Other/TraceCache.htm

微处理器之Trace Cache浅析,布布扣,bubuko.com

时间: 2024-12-24 01:45:04

微处理器之Trace Cache浅析的相关文章

Nop中的Cache浅析

Nop中定义了ICacheManger接口,它有几个实现,其中MemoryCacheManager是内存缓存的一个实现. MemoryCacheManager: using System; using System.Collections.Generic; using System.Runtime.Caching; using System.Text.RegularExpressions; namespace Nop.Core.Caching { /// <summary> /// Repre

基于.NET CORE微服务框架 -谈谈Cache中间件和缓存降级

1.前言 surging受到不少.net同学的青睐,也提了不少问题,提的最多的是什么时候集成API 网关,在这里回答大家最近已经开始着手研发,应该在1,2个月内会有个初版API网关,其它像Token身份验证,限流降级等功能完成时间会往后推 最近也更新了surging新的版本 更新内容: 1. Cache中间件基于Redis 所依赖的第三方库已将servicestack.redis转成stackexchange 2. 增加缓存降级3. 增加拦截缓存降级的例子 开源地址:https://github

LPC2138微控制器之定时器、看门狗、VIC实例

本实例使用LPC2138微控制器,Keil+Proteus模拟实现. 本实例使用定时器计数,当计数值到达时触发定时器中断,在定时器中断程序中喂狗,涉及模块包括晶振.PLL.定时器.看门狗和VIC. 每次喂狗的同时,将P0.1 GPIO输出电平取反,外接一个LED灯作为Active信号灯. 直接贴代码: main.c int main(void) { int ret = 0; unsigned char reason = 0; unsigned char byte = 0; /* Fosc & C

LPC2138微控制器之I2C

原文地址:https://www.cnblogs.com/justin-y-lin/p/12340792.html

计算范式

本文由giantpoplar发表于csdn,未经允许不得转载. 引言 从大一进入软件工程专业以来,到现在大三,陆续听说了很多关于"计算"的词语,比如并行计算,分布式计算,网格计算,云计算,串行计算,异构计算等等,这些名词大多给我一种不明觉厉的感觉,一直想着了解一下这些概念,恰好在读<云计算与分布式系统--从并行处理到物联网>一书时,看到第一章第一节里提到集中式计算.并行计算.分布式计算.云计算这四种计算范式的区别,书中使用了"计算范式"这个词,感觉这个词

计算机科学精彩帖子收集

inux源码 LXR 源自"the Linux Cross Referencer",中间的"X"形象地代表了"Cross".与 Source Navigator 类似,它也是分析阅读源代码的好工具.不同的是,它将源代码借助浏览器展示出来,文件间的跳转过程成了我熟悉的点击超链接动作. http://lxr.linux.no/   LXR安装过程简介 linux手册 http://linux.die.net/man/ Linux每周新闻 http:/

cpu,内存,虚拟内存,硬盘,缓存之间是什么关系??

1.CPU即中央处理器,是英语“Central Processing Unit”的缩写.CPU从内存或缓存中取出指令,放入指令寄存器,并对指令译码分解成一系列的微操作,然后发出各种控制命令,执行微操作系列,从而完成一条指令的执行. 2.但是,CPU并不能直接调用存储在硬盘上的系统.程序和数据,必须首先将硬盘的有关内容存储在内存中,这样才能被CPU读取运行.因而,内存(即物理内存,是相对于硬盘这个“外存”而言)作为硬盘和CPU的“中转站”,对电脑运行速度有较大影响. 3.当运行数据超出物理内存容纳

IT英语4-计算机英语缩写术语

1.CPU 3DNow!(3D no waiting,无须等待的3D处理) AAM(AMD Analyst Meeting,AMD分析家会议) ABP(Advanced Branch Prediction,高级分支预测) ACG(Aggressive Clock Gating,主动时钟选择) AIS(Alternate Instruction Set,交替指令集) ALAT(advanced load table,高级载入表) ALU(Arithmetic Logic Unit,算术逻辑单元) 

每个程序员都应该了解的 CPU 高速缓存

每个程序员都应该了解的 CPU 高速缓存 英文原文:Memory part 2: CPU caches 来源:oschina [编者按:这是Ulrich Drepper写“程序员都该知道存储器”的第二部.那些没有读过第一部 的读者可能希望从这一部开始.这本书写的非常好,并且感谢Ulrich授权我们出版. 一点说明:书籍出版时可能会有一些印刷错误,如果你发现,并且想让它在后续的出版中更正,请将意见发邮件到[email protected] ,我们一定会更正,并反馈给Ulrich的文档副本,别的读者