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