指令重排相关

指令流水线所带来的一些问题

  1. 结构冒险

    流水线中出现硬件资源竞争

  2. 数据冒险

    流水线中后面的指令需要等待前面指令完成数据的读写

  3. 控制冒险

    流水线需要个怒前面指令的执行结果来决定下一步去哪儿之行

为了解决指令流水线的数据冒险所带来的停顿、CPU 搞了个乱序执行。

在遇到数据冒险时、指令调度单元从中选择一些没有数据依赖的指令来执行。后面再进行结果回写时、才按原有顺序进行回写。

这就是 CPU 带来的乱序执行。

Java 编译器处于 “优化” 的目的、按照某种规则将指令重新排序(尽管有时候看起来像乱序)

这就是编译器带来的乱序。

因为 CPU 缓存同步顺序带来伪乱序。

在这里插入图片描述

以上即是导致重排序的三种原因。

在这里插入图片描述

我们先来看看 CPU 缓存所带来的一些问题

比如现在两个 CPU 都对变量 i 进行 +1、现在 i 在内存中的值为 0 (非并发 + 1)

那么

  1. CPU1 从内存中将 i 值放入到自己的缓存中
  2. CPU1 对 i 值进行 +1、并将结果写到自己的缓存中
  3. CPU2 中的缓存中已经存在i的值了(可能是上一次读取缓存的)
  4. CPU2 对 i 值进行 +1、并将结果写到自己的缓存中
  5. CPU1和 CPU2 将自己缓存的 i 写回到内存中

此时 i 被加了两次、但是结果只有一次的的值。

缓存一致性协议 MESI

在这里插入图片描述

我们在来看看上面这个流程

  1. CPU1 从内存中将 i 值放入到自己的缓存中、此时该缓存行的状态位 S (CPU2 中也有该缓存、状态为 S)
  2. CPU1 发出失效命令、告知 CPU2 将它的缓存行状态置为I失效。CPU2 将 i 的缓存行状态更新为 I 并且回复 CPU1 ack 消息
  3. CPU1 收到 ack 消息之后将缓存行的状态由 S 变为 E
  4. 然后CPU1 对 i 值进行 +1、并将结果写到自己的缓存中、此时状态变为 M
  5. CPU2 对 i 值进行 +1 前发现 i 的缓存行位 I、发起读取、CPU1 收到请求、先将 i 刷回到 内存、状态变为 E 然后再发 i 的值给 CPU2 然后状态变为 S。然后 CPU2 再发起失效命令
  6. CPU2 对 i 值进行 +1、并将结果写到自己的缓存中
  7. CPU2 将自己缓存的 i 写回到内存中

(事实上获取i和失效命令会同时发出、invalidate read)

那么最终 i 会被正确的+1

上面这里并非是一个并发+1的场景、也可以是一个串行的场景、只不过第一次和第二次的+1分配到不同的 cpu 上。

通过 MESI 协议、貌似解决了缓存一致性的问题。

但是我们每次都需要等待到其他 CPU 的 ack 才能去执行指令、这样子太慢了、并且其他 CPU 也可能并不是马上会去执行失效请求的、因为可能它可能正在执行其他高优先级的指令。

所以又引入了另一个组件、store buffer

在这里插入图片描述

它的作用很简单

  1. CPU1 发起失效请求之后、CPU1 不会等其他 CPU 的 ack、而是马上执行指令、然后将执行的结果存放在 store buffer。由 store buffer 等待其他 CPU 回复 ack 、然后才将执行结果刷回到 CPU 的

但是这样子也会带来问题、比如我们下面的这段代码(ARM 架构上)

    int x = 0;int y = 0;private void write(){x = 1;y = 1;}private void read(){System.out.println(y);System.out.println(x);}

假设 x 的值已经被更新在 store buffer 了、这个时候 cpu 缓存里面 x 的值还是 0

这个时候 cpu 就会继续执行 y=1 假如这个时候 y

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/79719.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Permute 3 for mac音视频格式转换

Permute是一款Mac平台上的媒体格式转换软件,由Chaotic Software开发。它可以帮助用户快速地将各种音频、视频和图像文件转换成所需格式,并提供了一些常用工具以便于用户进行编辑和处理。 Permute的主要特点包括: - 支持大量格式:支…

通过cpolar内网穿透发布网页测试

通过内网穿透发布网页测试 文章目录 通过内网穿透发布网页测试 对于网站开发者来说,对完成的网页进行测试十分必要,同时还要在测试过程中充分采纳委托制作方的意见,及时根据甲方意见进行修改,但在传统的测试方式中,必须…

以太网帧格式与吞吐量计算

以太网帧结构 帧大小的定义 以太网单个最大帧 6(目的MAC地址) 6(源MAC地址) 2(帧类型) 1500{IP数据包[IP头(20)DATA(1480)]} 4(CRC校验&#xff…

认识FFMPEG框架

FFMPEG全称: Fast Forward Moving Picture Experts Group (MPEG:动态图像专家组) ffmpeg相关网站: git://source.ffmpeg.org/ffmpeg.git http://git.videolan.org/?pffmpeg.git https://github.com/FFmpeg/FFmpeg FFMPEG框架基本组件: AVFormat , AVCodec, AVDevice, AVFil…

MaxCompute发布按量付费闲时版,计算成本最高节省66.66%!

在大数据不断在追求计算效率和成本优化的背景下,阿里云云原生大数据计算服务 MaxCompute宣布推出按量付费闲时版,用户可选择用此版本完成时间不敏感的作业,从而降低计算成本,同等作业类型的计算费用与按量付费标准版相比&#xff…

【云原生】Docker中容器管理常用所有命令

1.docker 容器创建流程 2.容器运行本质 docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 创建容器基本选项:--name:为容器命名 -i:交互式创建容器 -d:后台创建容器 -t:为容器分配伪终端 Docker 容器存在的意义就是为…

vscode自动添加注释说明

1. 安装vscode 双击安装程序,默认安装即可(如:VSCodeSetup-x64-1.70.2.exe) 2. 安装doxygen文档生成插件 1> 打开vscode软件,点击左侧插件管理菜单 2> 点击右上角’…‘按钮,选择’Install from VSIX’(联网状态可以直接搜索doxygen下载安装) 3> 选择doxygen离线安装…

Golang之路---03 面向对象——接口与多态

接口与多态 何为接口 在面向对象的领域里,接口一般这样定义:接口定义一个对象的行为。接口只指定了对象应该做什么,至于如何实现这个行为(即实现细节),则由对象本身去确定。   在 Go 语言中,…

华为harmonyos4.0鸿蒙4.0安装谷歌服务框架Play商店,解决从服务器检索信息时出错

8月4号华为手机发布了全新的harmonyos4.0鸿蒙4.0系统,很多人需要问还是不是支持谷歌服务框架?那么答案是肯定的,它和鸿蒙3是一样的,一样的操作,一样的支持安装谷歌服务框架,安装Google play商店。测试机型&…

Flink State 和 Fault Tolerance详解

有状态操作或者操作算子在处理DataStream的元素或者事件的时候需要存储计算的中间状态,这就使得状态在整个Flink的精细化计算中有着非常重要的地位: 记录数据从某一个过去时间点到当前时间的状态信息。以每分钟/小时/天汇总事件时,状态将保留…

opencv-34 图像平滑处理-2D 卷积 cv2.filter2D()

2D卷积是一种图像处理和计算机视觉中常用的操作,用于在图像上应用滤波器或卷积核,从而对图像进行特征提取、平滑处理或边缘检测等操作。 在2D卷积中,图像和卷积核都是二维的矩阵或数组。卷积操作将卷积核在图像上滑动,对每个局部区…

CASAIM与迈普医学合作,基于CT数据三维重建和设计,在医疗辅具研究开发中实现高精度三维建模和偏差比对

近期,CASAIM与广州迈普再生医学科技股份有限公司(简称:迈普医学)合作,基于CT数据三维重建和设计,在医疗辅具研究开发中实现高精度三维建模和偏差比对,实现与缺损区域的精确匹配。 迈普医学&…

Zhang-Suen骨架提取算法

前言 本专栏针对的目标物体为物体裂缝量化,提取裂缝的骨架有助于裂缝长度的求解,故这一篇也是本专栏的开篇。 细化算法选择与分析 裂缝骨架的提取是十分有必要,如果我们能够得到裂缝的骨架图那么就很容易获得整条裂缝的长度。在当前经典的…

政府大数据资源中心建设总体方案[56页PPT]

导读:原文《政府大数据资源中心建设总体方案[56页PPT]》(获取来源见文尾),本文精选其中精华及架构部分,逻辑清晰、内容完整,为快速形成售前方案提供参考。 完整版领取方式 完整版领取方式: 如需…

decimal类型在MySQL中的正确使用 (长度和小数点)

1. MySQL(decimal) 对应 Java(BigDecimal) 2. decimal(16,2) MySQL中类型的设置, 长度16, 保留2位小数 3. 如果长度小于14, 则会出现没小数位的情况

数据采集的方法有哪些?

近年来,国家和各大企业都在部署大数据战略。“大数据”这个词也越来越频繁地出现在我们的生活中。当我们在进行网上冲浪时,页面总会跳出我们想要搜索的相关产品或关联事物。大数据,似乎总是能够“算”出我们“心中所想”。那么,大…

C++QT教程1——QT概述(下载与安装)

文章目录 1 Qt概述1.1 什么是Qt1.2 Qt的发展史1.3 Qt版本1.4 Qt的下载与安装下载地址:其实我是有点懵逼的,因为还有个qtcreator,我差点不知道下哪个。。。(qt框架比qtcreator功能更多更强大) 安装 1.5 Qt的优点1.6 QT成…

侯捷 C++面向对象编程笔记——9 复合 委托

9 复合 委托 9.1 Composition 复合 类似于c中结构里有结构——class里有class deque 是一个已经存在的功能很多的类(两头进出的队列);利用deque的功能来实现queue的多种操作 该例只是复合的一种情况——设计模式 Adapter 9.1.1 复合下的构造…

十四、ESP32播放音乐

1. 运行效果 2. 硬件电路 3. 代码 test.wav文件下载地址:

《向量数据库指南》——Rockset 为实时数据库添加向量嵌入支持(一)

2023年4月18日,数据库供应商 Rockset 公布了对向量嵌入的支持,此举旨在使用户能够实时搜索和操作任何类型的数据。 位于加利福尼亚州圣马特奥的 Rockset 以前支持结构化和半结构化数据,让用户可以使用 SQL 和 NoSQL 实时搜索和分析数据。 现在,通过增加对向量嵌入的支持…