Instruction Retired 退役指令
最近在研究DiFuzzRTL,其发现了Rocket Chip中出现的一个问题Instruction retired count not increased when ebreak
其中出现了Instruction retired
这个名词不是很明白,搜集了一些资料记录一下这个名词的含义,并且解释一下这个错误出现的具体原因。为了面向更多人本文将解释的更加通俗一些。
现代处理器的一个重要特征就是预测执行(Speculative execution),用维基百科上的例子解释一下。
假设某程序的结构如下:
- 从网络上下载一个数据A,耗时30秒。
- 如果下载A成功,则直接给出A的答案。
- 如果下载A失败,则计算30秒的算数B,并给出这个答案。
如果没有推测执行功能,那么当A下载后发现失败,那么就要再花30秒做算术B,总共耗时1分钟。但是,由于下载过程中CPU是空转,CPU可以认识到反正闲着也是闲着,不如在下载A的同时将B算出。这样如果将来需要到B,就节省了30秒的时间。就算不需要,丢弃B即可,仅增加些许功耗之外,也没有什么坏处。
这就导致了一个显而易见的结果,即CPU执行的指令数需要远多于程序流需要的指令数(因为CPU自行执行了很多可能被抛弃的指令),而被程序流确实所需要的指令就被“退役”了。所以说退役指令就是指被程序流真正需要的指令。
了解了Instruction retired
的概念,为了理解Rocket Chip中的错误我们还需要知道ebreak
指令的作用,
Instruction Retired 退役指令