在流水线处理器中减少分支延迟到零
Antonio M. Gonzalez and Jose M. Llaberia
摘要
一种减少流水处理器中分支延迟到零的机制将在本文被描述以及评估。这种机制基于多重预取、提早计算目标地址、延迟分支、并行执行分支条件。这种机制使用正如描述的分支目标指令存储器(Branch Target Instruction Memory)。下面将给出这种机制的分析模型,允许我们自己测试这套使用较低开销的机制的效率。这一模型不仅用来决定高速缓存的大小以最大化处理器性能,而且用来比较这套机制和其它策略的性能,还可以用来分析使用两种缓存体系的性能差异。
关键词
分支指令(Branch Instruction)
分支目标指令存储器(Branch Target Instruction Memory)
计算机体系结构(Computer Architecture)
指令高速缓存(Instruction Cache Memory)
指令独立性(Instruction Dependencies)
性能评估(Performance Evaluation)
流水线处理器(Pipelined Processor)
1. 简介
流水线技术是一种在处理器设计领域通过同时执行几条指令来提升性能的一种方式。然而,流水线所带来的效率的提升会因为由于指令独立性导致的冲突而大大减少。那些由于分支类指令,又称为控制独立性,带来的冲突对处理器的性能造成了严重的影响,而这恰恰是因为这一类指令在处理器所执行的指令中占有很大的比例。
当前的工作重点关注于设计以及评估这套机制在减少由于分支指令产生的冲突给流水线处理器带来的负面影响。我们将在本文陈述以及评估一套称为COBRA(Cost Optimization of BRAanches)的机制,这套机制可以消除由于分支产生的冲突并且允许处理器并行执行分支指令以及其他指令。通过这种方式,分支指令的开销可以减小到零。为了评估这套机制的性能,COBRA的数学模型被研发并与设计保持一致。
论文的其它部分组织如下。第2节将回顾之前在减小分支开销的工作。第3节将详细描述COBRA的工作机制。第4节将重点阐述COBRA数学模型。第5节将讨论COBRA性能并与其它策略进行比较。
2. 减少分支开销
文献中已经提出了一些机制用来减少分支的开销(【14】、【15】)。他们均使用如下所示的一种或几种技术:
a)延迟分支。延迟长度为n的分支是一种在其后n条指令执行后才起作用的分支指令。这套机制受益于编译器的使用,因为编译器需要复杂找到那些在n个延迟槽内调度的指令。尤其这套机制在MIPS 3000处理器广发应用。如果处理器拥有使得分支延迟槽里的指令无效的可能性,可以被妥善使用的分支延迟槽数目将会增加。这一机制称为挤压延迟分支(delayed branch with squashing)。SPRAC处理器就是使用了这一策略;
b)提早执行分支。分支所带来的冲突可以通过预先进行一些操作而减少。例如,Motorola 68040处理器用于额外的加法器用以当取到分支指令时就计算好目标地址。
c)分支预测。另一种预先获得分支结果的方法就是进行预测。比如,下一代处理器Intel 80960,在这一处理器中每一条分支指令都包含一位,由编译器使用以预测分支的可能结果。
d)多重预取。这是基于在每一种可能的分支路径进行指令预取。通过这种方式,当分支结果产生时,无论最终结果如何,取指阶段已经执行完毕了。这一技术在Intel i486实现。
e)并行执行分支。前面所说的技术都是用来减少由控制独立性造成的负面影响。如果分支的执行与其他指令的执行可以完全重叠,那么将获得更大程度的性能提高。这就是IBM RS/6000所使用的策略。
在多数处理器中,我们总会发现通过结合上述几种技术来建立一种减小分支花销的机制。COBRA机制正是采用了这样的方式。
3. COBRA机制
在这一节我们将重点描述COBRA机制。它适用于任何阶段数目的和条件码的流水线处理器。关于COBRA机制的预备知识在文献【6】、【7】、【8】中描述。
COBRA机制结合了几种技术以允许处理器可以并行执行分支指令以及其它指令。这些技术包括:提早计算目标地址、多重预取、延迟分支和并行执行分支。当COBRA第一次被提出时,与其它机制相比,它的新颖之处在于实现并行执行分支的方法,而这一方法正是基于提早计算目标地址并且预取两路分支。除此之外,COBRA还是目前我们所知道的第一种可以结合四种不同技术来减少分支花销的机制。在此之后,一些近期的处理器包括IBM RS/6000,也实现了一种结合四种技术的机制。实现不同的相同概念会导致不同的性能等级,COBRA的其它贡献是它实现的方式。COBRA可以通过使用传统的指令缓存或者分支目标地址存储器实现(二者将会稍后定义)。本文展示了通过使用后者的内存组织进行实现将对成本效益带来极大的提升。
为了解释COBRA的功能,我们需要区分处理器中两个主要的单元:指令单元(IU),负责取指令以及顺序指令;执行单元(EU),仅仅执行数据操作指令(除控制转移指令之外的所有指令)。目标地址通过使用预取技术提前计算得出。当IU发现分支指令时(通常在分支起作用前几个周期),计算目标地址并且预取两种可能路径的第一条指令(多重预取)。当清楚分支的条件后,选择其中一条预取指令执行。通过这种方式,刚刚介绍的延迟分支被减少到一个单元(通常来说,它减小到由取指操作占据的单元数目)。余下的延迟槽通过使用延迟分支的技术而得到有效利用。分支指令需要的所有操作都在IU阶段与EU阶段并行性执行。这意味着执行不同于分支的指令。通过这种方式,很多分支的开销可以减小为零。
Katevenis在参考文献【13】中提出的策略用来篡改与PC相关的分支目标地址。这一方法的基本思路是分支指令包含最少有意义的位,而不是偏移量。这一策略允许通过并行计算目标地址的有意义位,以在紧接着分支指令取指阶段的下一个周期预取在指令缓存中的目标指令。通过这种方式,由传统策略附件操作而带来的延迟分支将会避免。
图1显示了对于简单流水线使用COBRA机制执行分支指令的可能情况。在这个例子中,IU在第n个周期获取了一条分支指令。随后,IU继续取依次执行的下一条指令以及分支路径的指令。当在ALU(第n+3个周期)阶段置条件码位后,IU决定选择哪条路径并且匹配EU的第一条指令。从这时期开始,IU将从新的路径取指,直到遇到下一次分支。而计算条件码所带来的延迟通过延迟分支的技术得到试用【10】。如果ALU是整个流水线的第N个阶段,那么试用这种策略每种分支将只有N-2个延迟槽。
A. 存储器组织
COBRA机制的实现考虑了两种不同的高速缓存的组织方式。我们称这些组织方式为传统指令高速缓存(Conventional Instruction Cache Memory)和分支目标指令存储器BTIM。
指令高速缓存的布局单元是一个固定大小的块。而对于分支目标指令存储器由两个连续分支指令之间的指令组成(包括后一个分支指令)。这种方式,布局单元大小可变并且在执行阶段确定。这一单元将在下文被称作序列。
为了减少使用可变大小信息的管理单元的复杂性意味着,通常的办法是实现一个数量大小限定在指令高速缓存所保存的指令序列数目大小的BTIM。如果序列长度大于这一大小,余下的指令从下一级存储体系中获得。如果小于,余下的指令使用这一序列的后续指令填充。这样类似的实现方式在AM29000处理器中得到使用。
高速缓存的每一个条目被称为一个line。每一个line或者存储在传统情况的一个块,或者是BTIM情况下一个序列的一部分。
为了与下一级存储系统构建通路,需要使用一种突发模式协议。使用这种长度,则无需固定长度进行传输。根据给定的line发射指令后,存储器继续发射下一条line 的指令,每条指令一个周期,并且没有任何延时,直到处理器或存储器决定终止传输为止。通过这种方式,只要需要的指令在连续地址内,外部存储器只产生一次延迟。
每当高速缓存未命中,一条完整的新line将会装载入高速缓存。每条line内的指令以每周期一条的频率到达,方便它们装载入高速缓存。只要造成未命中的指令是可达的,就将它传递给IU并且开始执行。如果当一条line正在装载时,请求进入新的高速缓存(例如,当这条line包含一条分支指令),在开始进入新的高速缓存条目时前一条line必须完成装载。
B. IU单元的设计
图2和图3给出了实现COBRA机制的IU单元需要的主要组件。IU由一个BITM和必要的选择指令的硬件组成,它必须每个时钟周期向EU发送一条指令,能够预先发现分支指令并在指令流发送给EU前清除掉。传统的指令高速缓存的实现方法详见文献【8】。
IU使用BTIM预取分支路径的第一条line。由于BTIM可以在一个时钟周期内提供完整的line,因此对于分支路径的预取将延迟直到分支的条件码已经置位的周期。除非在请求的line并不在BTIM的情况下,提早访问BTIM没有任何的额外的好处。在这种情况下,进一步预期可以从外部存储器进行预取,但是由于IU仅有一条路径访问外部存储器,这也就意味着需要在分支的结果计算出来之前悬空序列中的下一条指令的取指周期。在文献【5】中我们验证了这一变化其实没有带来任何好处。
因此,在每个周期内IU必须要分析且仅分析紧随指令序列的下一条到EU流水线第一阶段的所有指令。如果分析的指令时一条分支指令,将从BTIM(如果命中)获得分支路径的line。在同一个周期内,置条件码的指令将处在ALU阶段。通过这种方式,在周期末BTIM的line(或相应丢失)将会根据条件码被选择或者丢弃。
在命中的情况下,IU有一个寄存器用来存储从BTIM获得的line。这条line内的第一条指令无需进行存储,因为需要将它立即送入EU。
X1是一个用以选择进入EU指令的多路选择器。X2是用以选择紧随X1中指令的指令多路选择器。这些指令通过提早分支检测电路进行检查,若为分支指令(RISC体系结果只需检测某一个或者某些操作码位)。用以生成这两个多路选择器控制信号的电路主要是由根据分支检测电路结果决定的1个或2个单元来增加的计数器。当选择分支路径时,计数器将复位为0。来自于外部存储器的指令需要在EU开始执行前一个周期送入IU,这是应为倘若这是分支指令,它需要被分支检测电路分析并被IU处理。另一个原因是,正如如上所说,没有任何额外的好处。如果因为任何原因,比如BTIM未命中,这些指令没有按时送入,EU流水线将产生一些气泡,将造成处理器性能的降低。在外部存储器提供的指令被IU处理期间,它将存储在Delay寄存器中。
当发现分支指令时,BTIM查找目标指令所在line。与此同时,设置条件码的指令处在ALU阶段。在周期末,条件码将决定是否进行分支。若分支,PC将装载目标地址并且X3选择送给外部存储器的地址。若对BTIM的访问产生了一个高速缓存缺失,所选择的地址就是目标地址。否则,就是分支目标地址加上line的大小。注意到突发传输已经初始化,因为上一次分支路径没有延迟,那么如果未分支,仍可继续进行突发传输。
分支目标地址由EU计算并发送回IU。Call和Return指令也是特殊的分支指令。Call指令可以如同算术类指令一样发送给EU单元,只需存储返回地址(目标地址由IU计算)。Return指令也可以发送给EU,并且如同分支一样进行处理,分支地址可以从相应的Call指令存储的地方获得。Call和Return指令这样处理的缺点是,不像其它分支指令,EU仅花费一个单元。因此,没法完全的并行执行。更有效也更昂贵的解决办法是,在IU建立一个硬件栈,IU将存储Call指令的返回地址,并同时进行EU处理。在这种情况,每当IU发现一条Return指令,其返回地址都可以从栈顶获得,这也完全可以与EU并行。通过这种方式,Call和Return指令的花销可以减小到零。下面陈述的一节将在IU拥有这样一个栈的情况下进行阐述。
4. COBRA建模
在这一节将着重讨论关于使用BTIM的COBRA实现机制的数学模型。表1给出了这一数学模型的输入参数。这些输入参数可以归纳为三类:a)依赖于具体应用的( B,T,D(d),F(d) );b)依赖于具体实现的(L和S);c)既依赖于具体应用又依赖于实现的(H)。这一模型用来计算不同系统配置的处理器性能。另外,给出了延迟分支策略的数学分析模型。它的主要目的是用来显示使用延迟分支的COBRA机制与硬件开销的额外性能(上一节所述)。
A. 流水线
COBRA机制的效率以及延迟分支策略依赖于流水线的长度。本篇论文着重关注ALU处在第二位的流水线。对于这样的流水线,无论COBRA机制究竟是否需要延迟槽,延迟分支策略对于每条分支都会有一个延迟槽。除此之外,分支的执行与其它指令并行进行。更深的流水线意味着增加延迟分支策略的延迟槽。
B. COBRA的分析模型
使用COBRA机制的处理器的最优性能是分支指令仅需要零个周期,而其他指令需要一个周期。然而,为了实现这样的最优性能必须具备如下几个条件:
A. 每条分支目标地址的line必须存储在BTIM中。在BTIM中实际可以找到的line的比例依赖于BTIM中line的数目、BTIM的组织方式以及程序当时的位置;
B. 每个周期,EU执行一条非分支类指令。与此同时,IU对指令序列的下一条地址进行处理。甚至当某种情况下每条目标line都恰好在BTIM中时,都我们无法保证这是一种必然情况,因为对于那些指令序列大小大于BTIM中line 的长度时,我们仅可以从外部存储器获得指令。所以line的大小以及外部存储器的延时也会对处理器性能造成影响。为了研究分析模型,我们假定不会发生连续分支或者每两条分支之间至少有一条指令。这一假设通过引入了一个微不足道的错误简化了模型,因为这种情况在实际应用中几乎不会出现。
处理器的性能(P)计算为每周期执行的有效指令的平均数目。有效指令是指那些被EU处理的指令(除分支外的所有指令)。在这种情况下,,这里D是每条指令(包括分支指令)的平均缺失周期数。为了计算D,将按照缺失的来源不同进行分类讨论。有5种原因造成缺失周期:1)由于BTIM缺失造成的存储延时;2)完整替代一条line造成的延时;3)BTIM命中造成的存储延时;4)由于BTIM缺失造成的预期缺失;5)由于分支不成立造成的预期缺失。这样,,这里代表第i个原因造成的每条指令的平均缺失周期。进一步讨论针对每种的表达式。
(1)由于BTIM缺失造成的存储延时。也就是,当分支成功,并且当IU访问BTIM以获取下一序列时高速缓存发生缺失的情况。
高速缓存缺失造成的花销是L周期。这一情况发生的可能性是。由此造成的每条指令的平均缺失周期数目则是
由此造成的每条指令的平均缺失周期数目则是
(2)完整替代一条line造成的延时。也就是,当IU处理分支结果发现分支成功、之前的分支路径发生BTIM缺失并且两条分支间的距离(这里称为d)小于S-1的情况。在这种情况下,IU必须在BTIM搜索下一条新line前完成前一条line的代替。完整替代需要额外的S-1-d个周期。由此造成的每条指令的平均缺失周期数目是
(3)BTIM命中造成的存储延时。也就是,当前指令序列大于BTIM的一条line的大小,并且首指令在BTIM中,余下指令由外部存储器提供的情况。如果外部存储器的延时L大于line大小S,那么对于每条序列将有个丢失周期。由此造成的每条指令的平均缺失周期数目是
(4)由于BTIM缺失造成的预期缺失。也就是,当之前的分支发生BTIM缺失,随后进行产生任何分支指令的情况。在这种情况下在上次分支目标路径到下次分支目标路径之间的指令都由外部存储器以每周期一条速率提供,因此分支指令将花费一个周期,因为它们没能提早检测并且与其它指令重叠执行。在这种情况下,IU将向EU发送一条NOP指令以并行处理分支。由此造成的每条指令的平均缺失周期数目是
(5)由于分支不成立造成的预期缺失。当在BTIM中发现的序列长度大于line大小时此情况发生。让我们假设序列Y包含X条分支指令。从存储器读取完整序列花费的时钟周期数是Y-S+L,这部分有效指令的数目为Y-X。EU空闲的时钟周期数目为(Y-S+L)-(Y-X)=X-(S-L)。当S<L时,我们必须从这个数目中减掉第3种情况已经计算在内的条指令。总而言之,我们至少要为分支不成立之前的至少S-L指令,每条指令算一次缺失周期,假设S-L<0,那么之前至少有一条指令分支未成立。由此造成的每条指令的平均缺失周期数目是
计算Pr(N≥K):我们假设当前分支独立于之前执行的分支,这也就意味着随即变量N服从几何分布。注意到在这种情况下,先前的分支符合不成立的条件,因此先前的所有分支与这在分析的分支指令时不同的指令。那么,我们合理地进行假设每一条分支指令都与其它分支指令独立,尽管这件事情没必要真实的。这样为我们的分析引入了一些微不足道的错误,并不足以影响模型证明的确认。由此,
计算Prob(I>S|N≥K):为了计算这一概率,我们需要先计算Pr(I>S)。为此,我们先要定义拥有Y条指令的序列中分支指令数目B_Y。易知
B_Y可以由如下表达式计算得出:
这里A_j是序列由j条分支组成的概率,则C_j(Y)表示由j条分支指令组成的序列长度为Y的概率。
因为我们之前做出的假设,A_j由几何概率密度分布确定,这也就意味着:
C_j(Y)依赖于F(d)且可以通过如下表达式计算:
Pr(I>S|N≥K)的求导与Pr(I>S)相似,仅区别于需要考虑那些多余K条分支的序列,而首个K个分支将不在计算包含之中。易知:
这里M_k(k)代表序列中除首个K条分支之外的余下分支,并且假设序列至少有K+1条分支指令。其值等价于
这里的和如上述定义。
(6)模型确认。分析模型的正确性通过4个基准测试程序的仿真结果验证:LEX、NROFF、PCC和YACC(各自执行9、12、21和42百万指令)。程序使用C语言编写编译为RISC-Ⅱ汇编语言【13】,它们的执行过程使用文献【1】所述的方法进行仿真。通过仿真,不仅可以获得COBRA这套机制的实际性能,也可以获得表1所述的输入参数。仿真结果在不同的高速缓存大小、line大小、外存延时的条件下给出。通过这种方式处理器在不同的输入参数的条件下获得了相应的性能结果。该模型预测的性能与处理器仿真性能误差不超过3.76%,平均误差为1.36%。
C. 延迟分支的分析模型
有关存储组织,我们称之为BTIM,line大小与存储器延时大小相同(L = S)就足以在指令执行频率方面获得最大的优势。进一步增加line大小将减缓外部存储器的传输效率,并且由于额外指令都需要存外部存储器获得,这种对于line 大小的盲目增加不会打来任何益处。因此,以下模型假设S与L相等。每条指令的平均缺失周期由以下4个方面构成:
a) 分支指令执行:B;
b) 未优化的分支延迟槽:B(1-P_0)。的值可以从每个基准测试程序的执行仿真结果中获得;
c) 分支目标路径的BTIM缺失:B(1-H);
d) 根据先前的BTIM缺失替代line未完成前再次分支成立:B(1-H)N_c。这里指的是还未完全装载的高速缓存line入口的平均指令数目。它可以根据如下表达式计算:
然后,处理器的性能,也就是平均每个周期执行的有效指令数目为
由模型估计的结果与基准测试程序以15种不同参数测试的结果相比,误差通常小于0.22%,平均误差为0.05%。
5. 性能评估
这一节将着重分析COBRA机制的效率。首先,我们调查了line的大小为多少可以最大化COBRA机制的性能。其次,给出了延迟分支策略与提升COBRA机制性能的关系。最后,通过两种不同的高速缓存组织方式对COBRA机制的性能进行比较。
A. 高速缓存line大小
这一数学模型的首个应用就是决定对于COBRA机制最优BTIM的line大小。典型的外部存储器的延时(三个周期)用来假定分析。在这一节,我们将证明对于给定的外部存储器延时,成本与性能平衡后得出的最好结果是line长度为4条指令。
处理器的性能由BTIM的line大小范围从1到6,命中率从0到1获得(注意表1说明命中率仅仅决定于line的条数而非line的大小)。其它的该模型输入参数(详见表1),由具体应用决定,现假定为4种基准测试程序得到的平均值。结果如图4所示。
图4显示的主要结论是对于给定的命中率,处理器的性能随着给定line大小的增加而增加,但仅仅到给定值。line大小的进一步增加将造成处理器性能的降低,因为当高速缓存未命中时需要装载新的line。从图中我们也可以看到命中率越高,性能开始降低的line大小也越大。图左侧(命中率为0)的性能随着右侧的line大小的增加而减少,性能随着line大小的增加而增加。
当line大小比外部延时(1或2条指令)低时,处理器的性能十分的低。如果我们比较图中line为3与line为4的曲线,我们可以发现后者的性能从命中率较低(≥0.4)时更好,两者性能在命中率为0.7~0.9之间时有显著的差异。仅当命中率大于0.7时,进一步增加line大小才有意义。在这种情况下,芯片的性能很低并不足以额外芯片开销的成本。由此,我们可以认为成本与效率最好的平衡点是4条指令的line大小。
B. COBRA vs 延迟分支
这一节将显示COBRA机制所带来的优势。我们已经清楚了实现它需要的硬件花销。在此,我们将COBRA机制与延迟分支策略进行性能的比较。由于后者不适用任何额外的性能,我们可以想象得到额外的硬件给COBRA机制带来的性能的提升。|
表5显示了延迟分支机制与COBRA机制的性能。在这两种情况下,假定采用相同的高速缓存组织系统,即高速缓存直接映射32、64、128或256条line。line大小与延迟分支策略的存储延时(3条指令)相等并且加1等于COBRA机制的延时(4条指令)。无论延迟分支选择如何,line大小都在上一节进行了验证。正如第4节C部分解释的那样,使用大于存储延时的line不会给指令执行比率带来额外的增加。因此,对于4条指令大小的line,其性能与图5中描述的带有延迟分支的BTIM相同。分析模型的其它输入都可以从每个基准测试的仿真执行获得。
对于LEX,COBRA机制的效率比延迟分支策略高36%(36条line的BTIM)到40%(256条line的BTIM);对于NROFF,高6%到21%;对于PCC,高12%到21%;对于YACC,高24%到26%。高速缓存的命中率越高,二者的差异越明显。
C. BTIM vs 传统指令高速缓存
对于不同的存储组织进行COBRA机制效率的比较也很有趣。图6显示了使用COBRA机制以及指令高速缓存的性能。在这两种情况下,我们都假定相同的高速缓存line数目、相同的line大小(4条指令)、直接映射以及3个周期的存储延时。使用文献【8】所述方法获取传统指令高速缓存性能。
图6显示了对于给定的评估参数,BTIM机制以及传统指令缓存方式对于LEX和YACC性能相近,而对于NROFF和PCC,BTIM机制的性能较为优越。BTIM机制对于传统指令缓存对于LEX改善的范围是-1%到-3%,对于NROFF范围为29%到2%,对于PCC范围为18%到12%,对于YACC范围为4%到-5%。LEX、YACC与NROFF、PCC最大的不同之处在于,前面连个程序拥有更高的时间局部性。我们从图6中也可观察到BTIM机制的改进随着line数目的增加而增加。所以结论是:当命中率接近于1时两者的效率几乎相同,当命中率没那么高时,BTIM机制的效率似乎更高。
另一方面,BTIM机制比传统高速缓存生成更多的通信量。对于LEX,BTIM通信量比传统高速缓存高424%到5220%;对于NROFF,BTIM通信量比传统高速缓存高28%到234%;对于PCC,BTIM通信量比传统高速缓存高46%到104%;对于YACC,BTIM通信量比传统高速缓存高422%到5956%。原因是因为BTIM中很多指令都需要从外部存储器中获得,而不论高速缓存line的数目或命中率。获取这些指令是因为序列大小远远大于line的长度。在这种情况下,BTIM仅仅存储序列的首指令(仅为一条line大小),甚至是当BTIM命中发生时,其余指令也从外部存储器获取。值得注意的是这一额外的通信量并没有给处理器带来额外的延时,因为访问外部存储器与BTIM提供的其余指令的执行阶段重叠并行进行。
最后,关于硬件开销,BTIM机制的IU实现仅仅需要简单的硬件电路。关于传统高速缓存的实现可以在文献【8】中获得。总而延时,BTIM机制较传统的高速缓存提供了更好的成本效益,因为前者简化了IU的实现并且在很多情况下其效率高于后者。
6. 结论
关于减小流水线处理器中的分支开销,我们阐述并且测评了一种称为COBRA的机制。这一机制基于5种技术:a)提早计算目标地址;b)多重预取;c)延迟分支;d)并行执行分支指令。
并且提出了使用BTIM的实现方法。该系统的行为特征可以通过一个分析模型得到验证。这一模型用来选择在外部存储延时为3个周期时,BTIM的line最合适的大小,等同于该延时与一个阶段延时的和。
COBRA机制的性能平均比延迟分支策略高25%并且实现COBRA机制的额外电路也很简单。我们也比较了使用不同高速缓存组织方式的两种不同COBRA机制的实现。结论是,在成本效益方面,BTIM的性能要好于传统高速缓存,尽管前者需要进行更多的通信。额外的通信并不意味着处理器速度的降低,因为通信可以与BTIM提供的指令的执行并行。
【原创翻译】Reducing Branch Delay to Zero in Pipelined Processors的更多相关文章
-
【原创翻译】认识MVC设计模式:web应用开发的基础(实际编码篇)
原文地址:http://www.larryullman.com/2009/10/15/understanding-mvc-part-3/ 全系列INDEX [原创翻译]认识MVC设计模式:web应用开 ...
-
【原创翻译】初识Unity中的Compute Shader
一直以来都想试着自己翻译一些东西,现在发现翻译真的很不容易,如果你直接把作者的原文按照英文的思维翻译过来,你会发现中国人读起来很是别扭,但是如果你想完全利用中国人的语言方式来翻译,又怕自己理解的不到位 ...
-
原创翻译-测试驱动开发(TDD)
测试驱动开发原则 翻译自<<Expert Python Programming>> 测试驱动开发是指首先编写包含所有测试软件特点的测试集,然后再去开发软件.也就是说,在编写软件 ...
-
原创翻译-值得关注的10个python语言博客
原文链接 原文链接的网页感觉网络不是很好,不容易上.我在这里就给大家做个翻译吧. 大家好,还记得我当时学习python的时候,我一直努力地寻找关于python的博客,但我发现它们的数量很少.这也是我建 ...
-
【原创翻译】The Free Lunch Is Over
微软C++大师Herb Sutter的文章<The Free Lunch Is Over>翻译,以前自己也经常翻译,但是都不会上传博客.个人很喜欢这篇文章,所以以此作为翻译生涯的开始. 免 ...
-
【原创翻译】ArcGis Android 10.2.4更新内容简介
翻译不当和错误之处敬请指出 更新内容官方描述 https://developers.arcgis.com/android/guide/release-notes-10-2-4.htm 10.2.4的版 ...
-
Golang+Protobuf+PixieJS 开发 Web 多人在线射击游戏(原创翻译)
简介 Superstellar 是一款开源的多人 Web 太空游戏,非常适合入门 Golang 游戏服务器开发. 规则很简单:摧毁移动的物体,不要被其他玩家和小行星杀死.你拥有两种资源 - 生命值(h ...
-
[原创翻译]Protocol Buffer Basics: C#
Protocol Buffer 基础知识:c# 原文地址:https://developers.google.com/protocol-buffers/docs/csharptutorial ...
-
Symfony2创建基于域名的路由(原创翻译)
你可以匹配将要来到的请求以HTTP域名的方式 YAML方式 mobile_homepage: path: / host: m.example.com defaults: { _controller: ...
随机推荐
-
[Java]Java日期及时间库插件 -- Joda Time.
来到新公司工作也有一个多月了, 陆陆续续做了一些简单的项目. 今天做一个新东西的时候发现了 Joda Time的这个东西, 因为以前用的都是JDK原生的时间处理API, 大家都知道Java原生的时间处 ...
-
Unity新功能|全息模拟器
http://forum.china.unity3d.com/thread-21539-1-1.html
-
Python定时任务框架APScheduler 3.0.3 Cron示例
APScheduler是基于Quartz的一个Python定时任务框架,实现了Quartz的所有功能,使用起来十分方便.提供了基于日期.固定时间间隔以及crontab类型的任务,并且可以持久化任务.基 ...
-
python 循环设计
for循环 1.range()用法 for循环后的in跟随一个序列的画,循环每次使用的序列元素而不是序列的下标 例:s='abcdefg' for i in range(0,len(s),3): pr ...
-
java单点登录系统CAS的简单使用
转:http://blog.csdn.net/yunye114105/article/details/7997041 背景 有几个相对独立的java的web应用系统, 各自有自己的登陆验证功能,用户在 ...
-
sql server 各种函数
SQL2008 表达式:是常量.变量.列或函数等与运算符的任意组合. 1. 字符串函数 函数 名称 参数 示例 说明 ascii(字符串表达式) select ascii('abc') 返回 97 返 ...
-
debian网易163更新服务器 源
sudo vi /etc/apt/sources.list 加入如下内容即可: deb http://mirrors.163.com/debian/ jessie main non-free cont ...
-
solrnet的使用
solr与.net系列课程(五)solrnet的使用 solr与.net系列课程(五)solrnet的使用 最近因项目比较忙,所以这篇文章出的比较晚,离上一篇文章已经有半个月的时间了,这节课我们 ...
-
在微信小程序中学习flex布局
网页布局(layout)是CSS的一个重点应用. 布局的传统解决方案,基于盒状模型,依赖display属性 + position属性 + float属性.它对于那些特殊布局非常不方便,比如,垂直居中就 ...
-
js 跨域问题 汇总
前言 相信每一个前端er对于跨域这两个字都不会陌生,在实际项目中应用也是比较多的.但跨域方法的多种多样实在让人目不暇接.老规矩,碰到这种情况,就只能自己总结一篇博客,作为记录. 正文 1. 什么是跨域 ...