- 主题:CPU指令乱序执行的好处是啥?
如果多线程共享全局变量之类的场景,指令乱序执行怎么确保运行正确呢?
--
FROM 36.112.69.*
说的是CPU指令乱序执行,不是程序和编译的事
【 在 stub 的大作中提到: 】
: 那是码农该管的事,不是cpu的职责
--
FROM 36.112.69.*
编译器不知道线程共享变量之类的场景啊
【 在 vabc3 的大作中提到: 】
: 充分利用流水线
: 编译器需要正确插入barrier
:
--
FROM 223.104.39.*
比如,arm Linux应用编程,barrier的api一般是啥?
比较奇怪的是,应用开发大量线程共享变量的情况,我很少看到有人设barrier,但好像也没啥大的问题,这是为啥呢?
【 在 cybereagle 的大作中提到: 】
: CPU确保乱序执行对单线程不改变语义
: 多线程情况提供各种barrier给开发者使用
: 开发者负责根据自己的需求准确使用这些指令达到所需效果
--
FROM 36.112.69.*
你的意思编译器会明白线程共享变量场景,然后自动加上barrier指令,不能吧?
【 在 cybereagle 的大作中提到: 】
: 因为编译器/库里有 barrier 指令啊
--
FROM 36.112.69.*
但是C语言呢,没几个人会知道插入barry啊
【 在 cybereagle 的大作中提到: 】
: 不一定基于线程共享变量
: 比如 java 从语言层面定义了 volatile 有 happen-before 的语义
: 那么在实际编译执行 volatile 变量读写语句的时候
: ...................
--
FROM 36.112.69.*
就是汇编级的指令不会乱序?
【 在 nnzt 的大作中提到: 】
: 乱序并不是在汇编代码指令那个粒度来“乱序”。 (虽然逻辑上编译器/汇编器?可以有限调整一些不相关指令的顺序,比如 add a, b ; add c, d这种)
: CPU的乱序是在微码那个粒度来 乱序的。具体的搞法是译码之后交到后端的乱序执行器去执行。此时一个前面的汇编指令可能变成一坨后端的微指令,而且寄存器也都是在寄存器池里面四处tag的。CPU乱序执行能够保证微码在进入后端,以及从后端retire的时候顺序一致。
: 至于你说的多线程共享全局变量这个,跟乱序关系不是非常大,主要是缓存一致性协议来保证的。
--
FROM 36.112.69.*