本文主要是介绍1.4 Crime and Punishment,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
很多时候,一个架构师选择Load/StoreSpeculation的终极方法是掷硬币,只是在用一只很有技巧的手去投掷这个硬币。这些猜测是无限追求完美的人群,在屈服于最终的命运安排之后使用的赌徒方式。有人质疑这种掷硬币和闭着眼睛猜有什么区别。闭着眼睛猜确实是一种办法,只是当你睁开双眼发现迷失后,知道归时之路。
Load/StoreSpeculation的结果可能正确,也可能错误。如果最终结果是正确的,是一次成功的投机,如果错误会带来一定的惩罚。如果一次投机将导致不可收拾的系统惩罚,其最终结果不如不进行这些猜测。片面追求投机而忽略惩罚只是莽夫所为。合理的预测执行与失败后可以承担的惩罚是一个大的权衡。投机是人类与生俱来的。在投机的成功率越高,相应的惩罚越低时,这个天性就更加容易暴露。
Speculation策略需要在成功率和惩罚间进行取舍。让我无限制的悔棋,从理论上说我可以战胜一切对手。只是这个对手如果是李昌镐,至死我也下不完一盘棋,所以我将目标设为悔棋十步,去挑战那位每次只能胜我一目半目的邻居。采用十步悔棋规则后,那位邻居每次战至中盘,即与我签订城下之盟。
溯本求源,我们重新讨论为什么会出现Load/Store Speculation。为简化起见,我们仅在此讨论Load Speculation而忽略Store Speculation。在现代处理器系统中,存储器Load请求所需的Latency相对于CPU的主频在不断提高,使得存储器瓶颈问题更加突出一些。使用Load Speculation的主要原因是为了掩盖这些Load Latency,尽量的让执行延时较长的存储器读指令笨鸟先飞早入林。如何决定让那只笨鸟先飞是一个较为复杂的预测过程。在讲述这些预测之前,我们首先讨论这些预测的基本实现机制和预测失败的后继处理方法。
我们简单回顾ConfidenceCounter机制,Confidence Counter是一种常用的,判断是否应该进行预测的加权处理方式。除了Load/Store Speculation实现之外,Confidence Counter也广泛应用于Branch Prediction领域,是一种已经得到证明的,行之有效的方式。其实现机制与N-bit Saturating Counter(BimodalPredictor)类似。Confidence Counter由Saturation,Predict Threshold,Misprediction Penalty和Increment for Correct Prediction四个参数[14][15]组成。
我们以{31(Saturation),30(Threshold), 15(Penalty), 1(Increment)}为例简要说明Confidence Counter的使用方法。假设在一个应用中,Confidence Counter的初值为29,此时指令流水线将不会进行Load Speculation操作。如果指令流水线发现执行的最终结果为真时,Confidence Counter将加1(Increment);当Confidence Counter的值等于或者超过Threshold时,指令流水线开始进行Load Speculation;如果Confidence Counter的值为31(Saturation)时,结果为真时也保持不变;如果预测失败后,Confidence Counter将一次减去15(Penalty),直到逐步加1到达Threshold后才能触发Load Speculation。
在BranchPrediction
这篇关于1.4 Crime and Punishment的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!