0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

证明CPU指令是乱序执行的

sakobpqhz6 来源:平凡人笔记 2023-03-15 09:13 次阅读

承接上文CPU缓存一致性原理

双击QQ.exe从磁盘加载到内存里面,内存里面就会有了一个进程,进程产生的时候会产生一个主线程,就是main方法所在的线程,cpu会找到main开始的地方,把它的指令读取过来放到程序计数器,把数据放到寄存器,然后ALU开始做计算,一步一步来执行整个程序,这就是普通程序执行的过程。

cpu速度要比内存的速度快100倍,中间有各种各样的缓存,最常见的是三级缓存,由于它的速度非常快,在执行指令的时候也会有一些优化,比如现在有2条指令,一个是mov指令即从内存中读取一个数据到某一个寄存器中,第二个指令是把寄存器中的指令数值加1,如果严格按照前后写的效率执行,会发现它的效率比较低;第一条指令从内存中读数据出来,cpu等待99个时间周期,如果读完第一个指令之后,才可以执行第二个指令的话,cpu将会有99个空档期,所以现在的cpu设计是流水线式的设计(采用流水线式后,并没有加速单条指令的执行,每条指令的操作步骤一个也不能少,只是多条指令的不同操作步骤同时执行,因而从总体上看加快了指令流速度,缩短了程序执行时间),发送一条指令在等待内存数据返回的过程当中,会把后面这条指令执行了即后面的指令跑到前面先执行了,简单称为cpu的乱序执行,主要是为了提高效率,在等待费时的指令执行的时候,优先执行后面的指令。

证明cpu乱序执行是存在的

a8a1ae18-c2ab-11ed-bfe3-dac502259ad0.png

这里有个死循环,每一次循环都会把这4个值(x、y、a、b)设置为0,每一次循环都会起2个线程,第一个线程会执行a=1、x=b,第二个线程会执行b=1、y=a;假设所有的语句都是按照顺序执行的,从多线程微观的角度进行时间顺序上的排列组合,你会发现会有各种各样的组合场景:

a8bd5a96-c2ab-11ed-bfe3-dac502259ad0.png

比如第一种组合,

aad8c54a-c2ab-11ed-bfe3-dac502259ad0.png

第一种组合先执行a=1、x=b,后执行b=1、y=a,得到的结果是x=0、y=1。

这6种排列组合的结果无论如何都不可能得到x=0、y=0的情况即只要按照顺序执行,绝对不会出现x=0、y=0。

这是数学上的排列组合,但cpu执行指令的时候未必是按照顺序执行的。

出现x=0、y=0的情况比较少见,为什么这么难出现?什么样的组合下才会出现?

aae81842-c2ab-11ed-bfe3-dac502259ad0.png

跑了270多万次才出现了一次x=0、y=0的情况,

ab0b8f84-c2ab-11ed-bfe3-dac502259ad0.png

这两种是乱序执行的排列组合,比如第一个场景是线程1先执行x=b、线程2执行y=a,切换到线程1执行a=1,切换到线程2执行b=1,结果是x=0、y=0。

只有这2种场景,2个线程的这2个指令都得颠倒顺序才会出现,这种很难出现,不管怎样,得出一个结论:cpu内部是乱序执行的。

单线程的情况下,2个指令乱了顺序执行没有关系,反正最终的结果是一样的,但是在多线程的情况下,非常有可能出现你不想看到的情形,比如x=0、y=0的情况,比如在预知中没有这种情况,但是多线程的情况下,会出现,所以一定会影响整个多线程程序的运行,单线程的程序不会影响。

有了as-if-serial(看上去像序列化的)指令就可以随便变换顺序,只要维持最终一致性即可;单线程的重排序只需要保证最终的一致性,比如a=b、y=1,随便重排序,只要能保证单线程的最终一致性。

审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 寄存器
    +关注

    关注

    30

    文章

    5036

    浏览量

    117760
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10449

    浏览量

    206576
  • 指令
    +关注

    关注

    1

    文章

    580

    浏览量

    35379
  • 缓存
    +关注

    关注

    1

    文章

    220

    浏览量

    26444
  • 线程
    +关注

    关注

    0

    文章

    489

    浏览量

    19500
收藏 人收藏

    评论

    相关推荐

    单片机执行指令过程详解

    因为指令是要求把取得的数送到A累加器,所以取出的数字经内部数据总线进入A累加器,而不是进入指令寄存器。至此,一条指令执行完毕。单片机中PC=0002H,PC在
    的头像 发表于 02-15 09:53 1.9w次阅读

    CPU指令的条件执行分享!

    ,是LE标志:恰巧,在print中有puts函数,puts函数中有判断,正好改变了CPSR中的高四位,使CPU执行该异常指令。再说一句,CPU执行
    发表于 09-10 05:45

    以Nehalem微架构为参照说明Cache Memory指令执行过程

    一假象迷惑,认为CPU乱序执行仅与硬件流水线相关,并不会影响软件程序。事实并非如此。微架构为了实现乱序执行,有些
    发表于 09-01 16:05

    什么是CPU分枝/乱序执行

    什么是分枝/乱序执行?   分枝(branch)是指程序运行时需要改变的节点。分枝有无条件分枝和有条件分枝,其中无条件分枝只
    发表于 02-04 10:49 773次阅读

    cpu执行指令的过程详解

    计算机每执行一条指令都可分为三个阶段进行。即取指令-----分析指令-----执行指令
    的头像 发表于 03-09 16:30 10w次阅读
    <b class='flag-5'>cpu</b><b class='flag-5'>执行</b><b class='flag-5'>指令</b>的过程详解

    CPU操作指令详解

    CPU将CS:IP指向的内存单元中的内容看作指令,因为,在任何时候,CPU将CS,IP中的内容当作指令的段地址和偏移地址,用它们合成指令的物
    的头像 发表于 09-24 17:52 9443次阅读

    80C51单片机指令的取指和执行时序详细说明

    现按4类指令介绍CPU时序。因为CPU工作的过程就是取指令执行指令的过程,所以
    发表于 09-27 17:16 1次下载
    80C51单片机<b class='flag-5'>指令</b>的取指和<b class='flag-5'>执行</b>时序详细说明

    嵌入式RISC-V乱序执行处理器的设计方案

    具有顺序单发射、乱序执行乱序写回等特性的三级流水线结构,运用哈佛体系结构及AHB总线协议,可满足并行访问指令与数据的需求。在 Artix-7(XC7A35T-L1CSG324FPGA
    发表于 03-11 10:57 17次下载
    嵌入式RISC-V<b class='flag-5'>乱序</b><b class='flag-5'>执行</b>处理器的设计方案

    超标量处理器的指令乱序提交机制综述

    针对超标量处理器中长周期执行指令延迟退休及持续译码导致的重排序缓存(ROB)阻塞问题,提出一种指令乱序提交机制。通过设计容量可配置的多缓存指令
    发表于 06-07 11:39 13次下载

    单片机是怎么执行指令的?

    单片机执行程序的过程,实际上就是执行我们所编制程序的过程。即逐条指令的过程。计算机每执行一条指令都可分为三个阶段进行。即取
    发表于 02-09 11:13 3次下载
    单片机是怎么<b class='flag-5'>执行</b><b class='flag-5'>指令</b>的?

    CPU指令执行过程 CPU指令流水线

    几乎所有的冯·诺伊曼型计算机的 CPU,其工作都可以分为 5 个阶段:取指令指令译码、执行指令、访存取数、结果写回。
    发表于 05-09 17:29 1.5w次阅读
    <b class='flag-5'>CPU</b><b class='flag-5'>指令</b>的<b class='flag-5'>执行</b>过程 <b class='flag-5'>CPU</b><b class='flag-5'>指令</b>流水线

    如何证明CPU指令乱序执行的呢?

    双击QQ.exe从磁盘加载到内存里面,内存里面就会有了一个进程,进程产生的时候会产生一个主线程,就是main方法所在的线程
    的头像 发表于 03-15 09:14 797次阅读

    当我们在谈论cpu指令乱序的时候,究竟在谈论什么?

    知道指令乱序策略很重要,原因是这样我们就能够通过barrier(内存屏障)等指令,在正确的位置告诉cpu或者是编译器,这里我可以接受乱序
    的头像 发表于 05-19 14:42 893次阅读
    当我们在谈论<b class='flag-5'>cpu</b><b class='flag-5'>指令</b><b class='flag-5'>乱序</b>的时候,究竟在谈论什么?

    编译器的乱序策略

    写这篇文章的目的,是想明确下cpu指令乱序这件事。只要是熟悉计算机底层系统的同学就会知道,程序里面的每行代码的执行顺序,有可能会被编译器和cpu
    的头像 发表于 05-19 14:46 482次阅读
    编译器的<b class='flag-5'>乱序</b>策略

    cpu执行程序内部变化

    CPU(Central Processing Unit)是计算机的核心部件之一,它负责执行计算机程序的指令,并进行数据处理和控制操作。CPU执行
    的头像 发表于 12-05 11:26 348次阅读