在以下伪代码中:
if (rdtscp supported by hardware) {
Invoke "rdtscp" instruction
} else {
Invoke "rdtsc" instruction
}
假设CPU不支持rdtscp
指令,因此我们回退到else语句。
如果CPU预测错误分支,指令管道是否可能尝试执行rdtscp
并抛出Illgal Instruction
错误?
在《英特尔处理器手册》第3A卷第6.15章:中明确记录了#UD陷阱(无效操作码执行)
在实现无序执行微体系结构的英特尔64和IA-32处理器中,此异常不是生成,直到试图撤销执行无效指令的结果为止;即解码和推测性地尝试执行无效的操作码不会生成此异常。同样,在Pentium处理器和早期IA-32处理器,此异常不是预取和初步处理的结果对无效指令的解码。
指令陷阱,如"非法指令"陷阱,在执行指令时生效,而不是在执行之前生效。程序通常取决于抛出陷阱时程序的状态,因此尽早执行程序将是体系结构中的一个严重错误。
编辑:好的,好的。摘自英特尔软件开发人员手册,第3A卷:
P6系列处理器推测性执行指令的能力不会影响中断处理器。中断发生在指令退出阶段的指令边界处决因此它们总是在"有序"指令流中获取。
这取决于如何定义"原因"。它能产生一些明显的效果吗?对
正如Hans和Sneftel所指出的,异常、中断、陷阱等都发生在退休时,错误的代码永远不会到达。因此,预测错误的分支不会导致错误路径指令的提交/退出,包括它们可能试图执行的任何非法操作码。
然而,预测错误的代码路径可能会以更微妙的方式影响微体系结构状态,您可能已经执行和缓存了加载、完成了页面遍历以及其他各种微体系结构事件——简而言之,当您不小心去预测某个分支时,您的CPU所做的所有艰苦工作(这在OOO CPU中相当多)。我非常怀疑任何CPU是否会从缓存/TLB中取出所有这些东西,所以要考虑到这些东西稍后可能会对程序的性能产生影响(无论好坏),只是不会对其功能行为产生影响。
如果你在优化性能(可能太复杂了,无法使用),这可能是不值得的,但如果你在保护代码的安全,可能需要考虑一下——一些黑客可能有办法从你的缓存中嗅探这些数据。