指令重排的原理

article/2025/5/21 18:50:46

指令重排

一. 指令重排的分类:

  • 编译器优化的重排
  • 指令级并行的重排
  • 内存系统的重排

编译器优化重排序指令级并行重排序不会影响程序的结果,因此程序员需要着重处理的是内存系统重排序带来的问题

二. 指令重排的原理:

1.编译器优化的重排:

编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序

2.指令级并行的重排:

为了提高CPU的执行效率,现代的CPU基本上都支持指令流水线。

2.1 指令流水线:

一条指令要执行要经过3个阶段:取指令、译码、执行,每个阶段都要花费一个机器周期,如果没有采用流水线技术,那么这条指令执行需要3个机器周期;如果采用了指令流水线技术,那么当这条指令完成“取指”后进入“译码”的同时,下一条指令就可以进行“取指”了,这样就提高了指令的执行效率。
指令步骤的并行。常见的六级流水线将指令流的处理过程划分为取指(FI)、译码(DI)、计算操作数地址(CO)、取操作数(FO)、执行指令(EI)、写操作数(WO)等几个并行处理的过程段。这就是指令6级流水时序。在这个流水线中,处理器有六个操作部件,同时对这六条指令进行加工,加快了程序的执行速度。几乎所有的高性能计算机都采用了指令流水线。

2.2 流水线停顿:

处理器的流水线设计中有流水线中的冲突(Hazards)问题:主要分为资源冲突和数据冲突

  • 资源冲突
    资源冲突是指流水线中硬件资源的冲突,最常见的是运算单元的冲突,譬如除法器需要多个时钟周期才能完成运算,因此在前一条除法指令运算完成之前,新的除法指令如果也需要除法器则会存在着资源冲突。在处理器的流水线中硬件资源冲突种类还有较多,在此不做一一赘述。解决资源冲突的方法可以通过复制硬件资源或者流水线停顿等待硬件资源的方法解决。
  • 数据冲突
    数据冲突是指不同的指令之间的操作数存在数据相关性造成的冲突。常见的数据相关性包括:
    • WAR(Write-After-Read)相关性,又称先读后写相关性;
    • WAW(Write-After-Write)相关性,又称先写后写相关性;
    • RAW(Read-After-Write)相关性,又称先写后读相关性。
2.3 停顿的优化:
  • 采用数据旁路传播(Data Bypass and Forward)技术尽可能的让前序指令的计算结果更快的旁路传播给后序相关指令的操作数;
  • 尽可能的让后序相关指令在等待的过程中不阻塞流水线而让其他无关的指令能够继续顺利执行。

3. 内存系统的重排:

在这里插入图片描述

3.1 Memory Bank 的划分 :

一般 Memory bank 是按 cache address 来划分的。比如 偶数 adress 0×12345000 分到 bank 0, 奇数 address 0×12345100 分到 bank1

3.2 重排序分析:

理想的内存访问指令顺序:

  1. CPU0 往 cache address 0×12345000 写入一个数字 1 。因为address 0×12345000 是偶数,所以值被写入 bank0.
  2. CPU1 读取 bank0 address 0×12345000 的值,即数字1 。
  3. CPU0 往 cache 地址 0×12345100 写入一个数字 2 。因为address 0×12345100 是奇数,所以值被写入 bank1.
  4. CPU1 读取 bank1 address 0×12345100 的值,即数字2 。

重排序后的内存访问指令顺序:

  1. CPU0 准备往 bank0 address 0×12345000 写入数字 1 。
  2. CPU0 检查 bank0 的可用性。发现 bank0 处于 busy 状态。
  3. CPU0 为了防止 cache 等待,发挥最大效能,将内存访问指令重排序。即先执行后面的 bank1 address 0×12345100 数字2 的写入请求。
  4. CPU0 检查 bank1 可用性,发现bank1 处于 idle 状态。
  5. CPU0 将数字2 写入 bank 1 address 0×12345100 。
  6. CPU1 来读取 0×12345000 ,未读到 数字1 ,出错。
  7. CPU0 继续检查 bank0 的可用性,发现这次 bank0 可用了,然后将数字1 写入 0×12345000 。
  8. CPU1 读取 0×12345100 ,读到数字2 ,正确。

从上述触发步骤中,可以看到第 3 步发生了指令重排序,并导致第 6 步读到错误的数据。
通过对指令重排,CPU 可以获得更快地响应速度, 但也给编写并发程序的程序员带来了诸多挑战。

3.3 解决重排序带来的问题:

内存屏障是用来防止CPU 出现指令重排序的利器之一。
在这里插入图片描述
StoreLoad Barriers是一个“全能型”的屏障,它同时具有其他3个屏障的效果。现代的多处 理器大多支持该屏障(其他类型的屏障不一定被所有处理器支持)。执行该屏障开销会很昂 贵,因为当前处理器通常要把写缓冲区中的数据全部刷新到内存中(Buffer Fully Flush)。
在这里插入图片描述

文章来源:https://blog.csdn.net/u012588160/article/details/114990528
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://chatgpt.dhexx.cn/article/JEaxfGCj.shtml

相关文章

java指令重排,为什么重排?

指令重排序是指编译器或CPU为了优化程序的执行性能而对指令进行重新排序的一种手段,重排序会带来可见性问题,所以在多线程开发中必须要关注并规避重排序。 从源代码到最终运行的指令,会经过如下两个阶段的重排序。第一阶段,编译器…

字符重排

输入一个字典(用******结尾),然后再输入若干单词。每输入一个单词w,你都需要在字典中找出所有可以用w的字母重排后得到的单词,并按照字典次序从小到大的顺序在一行中输出(如果不存在,输出:}).输入单词之间用…

volatile指令重排

计算机在执行程序时,为了提高性能,编译器和处理器常常会对指令重排,一般分为以下三种: 源代码 -> 编译器优化的重排 -> 指令并行的重排 -> 内存系统的重排 -> 最终执行指令 单线程环境里面确保最终执行结果和代码顺…

【Leetcode——重排链表】

文章目录 一、重排链表思路1.思路2. 总结 一、重排链表 对于这道题,有两种思路: 思路1. 1.使用一个线性表,存储链表中的每个节点,然后按照题目的条件,来链接线性表的各个节点即可。 使用左下标和右下标来定位线性表中…

什么是重绘和重排? 如何去避免?

前言 面试官:既然你刚刚提到了重绘和重排,那就说一说吧。 我:。。。💥 我们首先来回顾一下渲染流水线的流程: 回流 首先介绍回流。回流也叫重排。 触发条件 简单来说,就是当我们对 DOM 结构的修改引发 DOM 几何尺寸…

jvm指令重排

JVM会在不影响正确性的前提下调整语句(指令)的顺序。 例如下代码: static int i; static int j; // 在某个线程内执行如下赋值操作 i ...; j ...; //可以看到,至于是先执行 i 还是 先执行 j ,对最终的结果不会产生…

CSS重排与重绘总结

昨天面试被问到了什么是重排和重绘,回答的并不是很好,下面来总结一下:关于CSS重排和重绘的概念,在制作中考虑浏览器的性能,减少重排能够节省浏览器对其子元素及父类元素的重新渲染;避免过分的重绘也能节省浏…

Leetcode之重排链表

文章目录 前言一、线性表二、寻找链表中点 链表逆序 合并链表总结 前言 题目如下: 重排链表(点我) 一、线性表 因为链表不能下标访问元素,所以我们不能随机访问链表中的元素,因此我们采用数组来存储链表中的每一个元素。利用…

推荐算法架构4:重排

系列文章,请多关注 推荐算法架构1:召回 推荐算法架构2:粗排 推荐算法架构3:精排 推荐算法架构4:重排 1 总体架构 重排主要解决三大问题:用户体验

Cadence Orcad元器件位号重排与原理图页序号重排

一.为什么需要元器件位号重排 在画原理图的过程中,增删改的操作是很多的,这使得元器件位号是通常是混乱的。在绘制完成后,通常需要重排一下位号,这样同一功能块的元器件位号是相邻的,这使得画PCB时能比较方便的确定某一…

你真的了解重排和重绘吗?

做过前端开发的小伙伴就算不是非常理解重排与重绘,但是肯定都听过这两个词。那为什么这两个东西这么重要?因为他与我们的页面性能息息相关,今天,我们就来好好研究一下这两个东西。 浏览器的渲染流程 在讲解重排和重绘之前&#…

简单易懂之什么是重排和重绘?

文章目录 目录 一、浏览器页面是怎么生成的? 二、什么是重排和重绘? 1.什么时候发生重绘? 2.如何优化重排效率? 一、浏览器页面是怎么生成的? 首先让我们来先了解一下浏览器页面生成的过程 文字解析: 1&am…

重排(回流)和重绘

什么是重排和重绘 浏览器下载完页面所有的资源后,就要开始构建DOM树,与此同时还会构建渲染树(Render Tree)。(其实在构建渲染树之前,和DOM树同期会构建Style Tree。DOM树与Style Tree合并为渲染树) 浏览器下载完成所有…

什么是重排和重绘

简答 1.重排(重新排列)> 指元素的位置发生改变的时候浏览器会进行重排 2.重绘(重新绘制)>指元素的基本样式发生改变是发生重绘,比如颜色等。。。 细答 前提概要(浏览器使用两个引擎进行工作一是渲…

Docker之发布自己的镜像

首先应当是先登入 其次是将镜像重新打包 在此处使用命令 docker commit fb6af4e48c14 zlx/centos7_vim:1.0 将一个容器生成一个新的镜像 然后把这个镜像改成dockerhub的仓库名,push一下就行了,dockerhub毕竟是国外的网站,换成阿里云就好了

Matlab调用excel数据绘制折线图

如题,matlab之前没接触过,但是电脑上一直有安装,有些老师需要做几张图放论文里,所以尝试了一下(excel其实效果也行,但matlab感觉更专业) x2:2:778;%x轴上的数据,第一个值代表数据开…

COGS 2075. [ZLXOI2015][异次元圣战III]ZLX的陨落

★★☆ 输入文件:ThefallingofZLX.in 输出文件:ThefallingofZLX.out 简单对比时间限制:1 s 内存限制:256 MB 【题目描述】 正当革命如火如荼,情侣教会日薄西山之时,SOX和FFF的分歧却越来越大&#…

Codechef GRAPHCNT 支配树学习及tarjan算法求解

[Codechef GRAPHCNT]新年的有向图 【题目描述】 zlx同学在学习数论时,被虐了一脸,丧心病狂的他决定去报复社会。 zlx在公园里埋下N颗地雷,用来炸飞在春节期间秀恩爱的情侣。这N颗地雷由M条有向边连接成为一个有向图,zlx则在1号地雷处引爆1号地雷可以到达的地雷。现在,为了…

大数据体系建设经验分享

分享嘉宾:吴荣彬 分贝通 大数据部负责人 编辑整理:zlx 出品平台:DataFunTalk 导读:本文将介绍分贝通在大数据领域的一些建设经验。分贝通在ToB领域是一个年轻的公司,成立六年多,大数据体系刚刚建立一年多&a…

将二维数组转为稀疏数组进行压缩,提高效率

** 稀疏数组 ** ##基本介绍: 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。 稀疏数组的处理方法是: 1) 记录数组一共有几行几列,有多少个不同的值 2) 把具有不同值的元素的行列…