Joã*_*des 4 architecture x86 arm powerpc sparc
当无序处理器遇到类似的东西时
LOAD R1, 0x1337
LOAD R2, $R1
LOAD R3, 0x42
Run Code Online (Sandbox Code Playgroud)
假设所有访问都会导致高速缓存未命中,处理器是否可以在询问内容$ R1甚至0x1337之前询问内存控制器0x42的内容?如果是这样,假设访问$ R1将导致异常(例如,分段错误),我们可以认为0x42是以推测方式加载的,对吗?
顺便说一句,当一个加载存储单元向内存控制器发送请求时,它是否可以在收到前一个请求之前发送第二个请求?
我的问题并不针对任何架构.欢迎与任何主流架构相关的答案.
您的问题的答案取决于您的CPU的内存排序模型,这与允许乱序执行的CPU不同.如果CPU实现了总存储顺序(例如x86或Sparc),则在0x1337之前不会加载问题的答案为0x42
如果cpu实现了松弛的内存模型(例如IA-64,PowerPC,alpha),那么在没有内存栅栏指令的情况下,所有的赌注都将被关闭,因为它将首先被访问.除非您正在执行IO或处理多线程代码,否则这应该没什么关系.
你应该注意到一些CPU(例如Itanium)确实有松弛的内存模型(因此读取可能没有顺序)但是没有任何乱序执行逻辑,因为他们希望编译器以最佳方式排序指令和推测指令而不是在OOE上花费硅空间