并行编程之指令重排

什么是指令重排?为什么会指令重排?

为了使得处理器内部的运算单元能尽量被充分利用,处理器可
能会对输入代码进行乱序执行(Out-Of-Order Execution)优化,处理器会在计算之后将乱序
执行的结果重组,保证该结果与顺序执行的结果是一致的,但并不保证程序中各个语句计算
的先后顺序与输入代码中的顺序一致,因此,如果存在一个计算任务依赖另外一个计算任务
的中间结果,那么其顺序性并不能靠代码的先后顺序来保证。与处理器的乱序执行优化类
似,Java虚拟机的即时编译器中也有类似的指令重排序(Instruction Reorder)优化。

在调度器交互调用存取操作的“偶发时序”,会在没有正确同步的程序中引发错误的结果。更糟的是,JMM还允许从不同的角度看一个动作,此时该动作会以不同的次序执行。这使得在没有同步的情况下,推断动作的执行次序变得更加复杂。各种能够引起操作延迟或者错续执行的不同原因,都可以归结为一类重排序。

对于指令重排,在单线程模式下,是不会影响结果,这也是指令重排优化的前提。但是当出现在多线程情况下,就无法保证结果的正确性了。

从硬件架构上讲,指令重排序是指CPU采用了允许将多
条指令不按程序规定的顺序分开发送给各相应电路单元处理。但并不是说指令任意重
排,CPU需要能正确处理指令依赖情况以保障程序能得出正确的执行结果。譬如指令1把地
址A中的值加10,指令2把地址A中的值乘以2,指令3把地址B中的值减去3,这时指令1和指
令2是有依赖的,它们之间的顺序不能重排——(A+10)X2

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值