预取队列,缓存,管道,超标量设计

时间:2018-12-10 11:39:39

标签: assembly x86

我了解到,CPU的预取队列可能会影响程序的执行,并可能导致与预期行为(错误结果)的意外偏离。

除了分隔彼此影响的命令并祈求最好的命令之外,是否有任何方法可以避免上述情况?如果不是,则需要多少间距?

是否存在x86系列的其他任何功能(例如缓存,管道,超标量设计)会对程序产生负面影响?我指的不是时间安排(管道危险就是这种情况),而是错误的结果。

编辑:大家都回答说CPU优化不会影响正确性,只会影响速度。 我现在很困扰。例如,in Wikipedia声称此代码将不会按计划执行。另外还有 anti debugging tricks以及techniques for calculating queue's length(可能是utilized)才能确定CPU型号。

1 个答案:

答案 0 :(得分:3)

否,CPU遵守手册中记录的内存顺序和其他规则。

提前进行负载的预取(比内存模型允许的早)是推测性的,如果内核检测到它对负载使用了错误的值,则会进行内存顺序错误推测流水线刷新。

因此,现代x86 CPU在很多方面都处于严重失序状态,但是具有所有必要的跟踪功能,以保持单线程指令按顺序运行的错觉。 (对于多线程,其他线程实际上看不到任何违反内存模型的行为,只是在安全的情况下才可以这样做。)


或者CPU可能比手册具有更强/更安全的行为:例如实际上,指令预取不能导致过时的指令在现代Intel CPU上执行:它们可以窥探存储,以编码即将在管道中运行的地址。 Observing stale instruction fetching on x86 with self-modifying code

所以你的问题的前提是不正确的。