JAVA 为什么非要指令重排?

4 篇文章 0 订阅
1 篇文章 0 订阅

为什么非要指令重排?


(真就有人这么问了…)

这里涉及到计组中CPU的相关知识:流水线CPU的三种相关冲突。

流水线 CPU 断流次数影响执行性能:次数越多,性能越差。

但是,流水过程固有的三种相关冲突(资源相关、数据相关、控制相关)极易导致断流。

于是每个运行在计算机的程序(例如JVM),需要配合CPU进行程序优化,更好地压榨CPU…

除此之外,还有JVM中关于

流水线CPU的三种相关冲突

资源相关冲突:

在这里插入图片描述
例如:CPU时钟在4时,I1 MEM(访存取数) 与 IF(取指) 都需要访问存储器,假如好巧不巧,MEM 的 数据 和 IF 的指令在同一个单口的存储器(这不就相关了),这,就资源相关冲突了。

那么如何解决这冲突,很朴素想法:“时空分割”,要么在时间上错开(一个等待),要么分开存储。

数据相关冲突:

在这里插入图片描述

我们期望(代码)的是从上往下:ADD、ADD 再执行 SUB。

那么,第二条 ADD 的加数、第三条 SUB 的被减数 都要从 R1获 取,第一条 和数 存储在 R1,就有了相关性。

但是,CPU流水线并行执行(三个指令重叠执行)的时候,三条指令都在读/写 R1 的数据,那么 ALU ↔ R1 之间的数据读/取,就可能会产生数据相关冲突:

在这里插入图片描述
例如图中情况很显然:

第一条 ADD 在时钟5才存储结果,而第二条ADD,已经在时钟4做了EX。

第三条 ADD 在时钟5需要将数据从R1读取到ALU作运算,好巧不巧,第一条也正在向 R1 写数据。这样就叫数据相关冲突。

控制相关冲突

控制相关冲突是由于转移指令引起的,例如分支结构,由条件表达式的结果确定下一条要执行的指令。

图解,暂时画不动了…

【持续更新ing】

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值