为什么非要指令重排?
(真就有人这么问了…)
这里涉及到计组中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】