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

loading...


1

我读到CPU的预取队列可能会影响程序的执行,并可能导致不期望的偏离预期行为(错误的结果) .

是否有任何方法可以避免上述情况,除了间隔你的命令相互影响并祈祷最好?如果没有,间隔需要多少间距?

x86系列的其他功能(如高速缓存,管道,超标量设计)是否会对程序产生负面影响?我没有提到时间安排(如管道危险的情况),而是错误的结果 .

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

loading...

1回答

  • 3

    不,CPU遵循手册中记录的内存排序和其他规则 .

    负载的早期预取(早于内存模型允许)是推测性地完成的,如果内核检测到它对负载使用了错误的值,则内存顺序错误推测管道刷新 .

    因此,现代x86 CPU在很多方面都是无序的,但是通过所有必要的跟踪来保持单个线程的指令按顺序运行的错觉 . (对于多线程,没有任何违反内存模型的内容实际上对其他线程可见,只是在安全的情况下才会这样做 . )


    或者CPU可能比手册具有更强大/更安全的行为:例如 Instruction prefetch actually can't lead to stale instruction execution on modern Intel CPUs :他们将商店窥探到代码管道中正在传输的地址 . Observing stale instruction fetching on x86 with self-modifying code

    所以你的问题的前提是不真实的 .

评论

暂时没有评论!