- 主题:CPU指令乱序执行的好处是啥?
我感觉回答都没到一个点啊,为啥cpu要乱序执行指令,和多线程无关吧
【 在 wjhtingerx 的大作中提到: 】
: 如果多线程共享全局变量之类的场景,指令乱序执行怎么确保运行正确呢?
: --
:
发自「今日水木 on iOS」
--
FROM 183.195.10.*
只是乱序执行的好处的话,谷歌一搜都是现成的答案
【 在 RichyMong 的大作中提到: 】
: 我感觉回答都没到一个点啊,为啥cpu要乱序执行指令,和多线程无关吧
: 发自「今日水木 on iOS」
--
FROM 60.12.138.*
这正是楼主的问题
【 在 z16166 的大作中提到: 】
: 只是乱序执行的好处的话,谷歌一搜都是现成的答案
: --
发自「今日水木 on iOS」
--
FROM 183.195.10.*
膜拜
【 在 cybereagle 的大作中提到: 】
: 不一定基于线程共享变量
: 比如 java 从语言层面定义了 volatile 有 happen-before 的语义
: 那么在实际编译执行 volatile 变量读写语句的时候
: ...................
--
FROM 183.6.114.*
乱序并不是在汇编代码指令那个粒度来“乱序”。 (虽然逻辑上编译器/汇编器?可以有限调整一些不相关指令的顺序,比如 add a, b ; add c, d这种)
CPU的乱序是在微码那个粒度来 乱序的。具体的搞法是译码之后交到后端的乱序执行器去执行。此时一个前面的汇编指令可能变成一坨后端的微指令,而且寄存器也都是在寄存器池里面四处tag的。CPU乱序执行能够保证微码在进入后端,以及从后端retire的时候顺序一致。
至于你说的多线程共享全局变量这个,跟乱序关系不是非常大,主要是缓存一致性协议来保证的。
【 在 wjhtingerx 的大作中提到: 】
: 如果多线程共享全局变量之类的场景,指令乱序执行怎么确保运行正确呢?
--
FROM 98.42.117.*
就是汇编级的指令不会乱序?
【 在 nnzt 的大作中提到: 】
: 乱序并不是在汇编代码指令那个粒度来“乱序”。 (虽然逻辑上编译器/汇编器?可以有限调整一些不相关指令的顺序,比如 add a, b ; add c, d这种)
: CPU的乱序是在微码那个粒度来 乱序的。具体的搞法是译码之后交到后端的乱序执行器去执行。此时一个前面的汇编指令可能变成一坨后端的微指令,而且寄存器也都是在寄存器池里面四处tag的。CPU乱序执行能够保证微码在进入后端,以及从后端retire的时候顺序一致。
: 至于你说的多线程共享全局变量这个,跟乱序关系不是非常大,主要是缓存一致性协议来保证的。
--
FROM 36.112.69.*
我想一下,考虑到有分支预测这种邪恶的搞法,汇编级的指令应该是乱着开始,但是保序结束的。不然程序结果就有问题了。而且乱的方式可以非常豪放。
【 在 wjhtingerx 的大作中提到: 】
: 就是汇编级的指令不会乱序?
:
--
FROM 98.42.117.*
至少在 x86 上面,out of order execution 是建立在 register renaming 的基础上的。汇编指令都是翻译成微指令执行的,而 renaming 和 OoO 都是微指令层面的事情,在汇编层你无法知道是怎样进行的。不了解 arm,但据说 rosetta 能高效率的模拟 x86,就是因为 apple 在硬件层面实现了一个兼容 x86 执行顺序语义的模式,在模拟 x86 时直接切到该模式下运行。
【 在 wjhtingerx 的大作中提到: 】
: 就是汇编级的指令不会乱序?
--
修改:eGust FROM 203.184.25.*
FROM 203.184.25.*
乱序执行可以增加指令执行的并行度,提高性能
乱序执行顺序提交保证程序执行的正确性,实现精确异常
--
FROM 221.222.21.*
厉害,rosetta那个都知道
搜了一下,维基是这么说的:
One of the key reasons why Rosetta 2 provides such high level of translation efficiency is the support of x86-64 memory ordering in Apple M1 SOC
来源是这个:
https://twitter.com/ErrataRob/status/1331736203402547201
So Apple simply cheated. They added Intel's memory-ordering to their CPU. When running translated x86 code, they switch the mode of the CPU to conform to Intel's memory ordering.
【 在 eGust 的大作中提到: 】
: 至少在 x86 上面,out of order execution 是建立在 register renaming 的基础上的。汇编指令都是翻译成微指令执行的,而 renaming 和 OoO 都是微指令层面的事情,在汇编层你无法知道是怎样进行的。不了解 arm,但据说 rosetta 能高效率的模拟 x86,就是因为 apple 在硬件层面实现了一个兼容 x86 执行顺序语义的模式,在模拟 x86 时直接切到该模式下运行。
:
--
FROM 61.48.129.*