0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

證明CPU指令是亂序執(zhí)行的

sakobpqhz6 ? 來源:平凡人筆記 ? 2023-03-15 09:13 ? 次閱讀

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

雙擊QQ.exe從磁盤加載到內(nèi)存里面,內(nèi)存里面就會有了一個進程,進程產(chǎn)生的時候會產(chǎn)生一個主線程,就是main方法所在的線程,cpu會找到main開始的地方,把它的指令讀取過來放到程序計數(shù)器,把數(shù)據(jù)放到寄存器,然后ALU開始做計算,一步一步來執(zhí)行整個程序,這就是普通程序執(zhí)行的過程。

cpu速度要比內(nèi)存的速度快100倍,中間有各種各樣的緩存,最常見的是三級緩存,由于它的速度非???,在執(zhí)行指令的時候也會有一些優(yōu)化,比如現(xiàn)在有2條指令,一個是mov指令即從內(nèi)存中讀取一個數(shù)據(jù)到某一個寄存器中,第二個指令是把寄存器中的指令數(shù)值加1,如果嚴格按照前后寫的效率執(zhí)行,會發(fā)現(xiàn)它的效率比較低;第一條指令從內(nèi)存中讀數(shù)據(jù)出來,cpu等待99個時間周期,如果讀完第一個指令之后,才可以執(zhí)行第二個指令的話,cpu將會有99個空檔期,所以現(xiàn)在的cpu設(shè)計是流水線式的設(shè)計(采用流水線式后,并沒有加速單條指令的執(zhí)行,每條指令的操作步驟一個也不能少,只是多條指令的不同操作步驟同時執(zhí)行,因而從總體上看加快了指令流速度,縮短了程序執(zhí)行時間),發(fā)送一條指令在等待內(nèi)存數(shù)據(jù)返回的過程當中,會把后面這條指令執(zhí)行了即后面的指令跑到前面先執(zhí)行了,簡單稱為cpu的亂序執(zhí)行,主要是為了提高效率,在等待費時的指令執(zhí)行的時候,優(yōu)先執(zhí)行后面的指令。

證明cpu亂序執(zhí)行是存在的

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

這里有個死循環(huán),每一次循環(huán)都會把這4個值(x、y、a、b)設(shè)置為0,每一次循環(huán)都會起2個線程,第一個線程會執(zhí)行a=1、x=b,第二個線程會執(zhí)行b=1、y=a;假設(shè)所有的語句都是按照順序執(zhí)行的,從多線程微觀的角度進行時間順序上的排列組合,你會發(fā)現(xiàn)會有各種各樣的組合場景:

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

比如第一種組合,

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

第一種組合先執(zhí)行a=1、x=b,后執(zhí)行b=1、y=a,得到的結(jié)果是x=0、y=1。

這6種排列組合的結(jié)果無論如何都不可能得到x=0、y=0的情況即只要按照順序執(zhí)行,絕對不會出現(xiàn)x=0、y=0。

這是數(shù)學上的排列組合,但cpu執(zhí)行指令的時候未必是按照順序執(zhí)行的。

出現(xiàn)x=0、y=0的情況比較少見,為什么這么難出現(xiàn)?什么樣的組合下才會出現(xiàn)?

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

跑了270多萬次才出現(xiàn)了一次x=0、y=0的情況,

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

這兩種是亂序執(zhí)行的排列組合,比如第一個場景是線程1先執(zhí)行x=b、線程2執(zhí)行y=a,切換到線程1執(zhí)行a=1,切換到線程2執(zhí)行b=1,結(jié)果是x=0、y=0。

只有這2種場景,2個線程的這2個指令都得顛倒順序才會出現(xiàn),這種很難出現(xiàn),不管怎樣,得出一個結(jié)論:cpu內(nèi)部是亂序執(zhí)行的。

單線程的情況下,2個指令亂了順序執(zhí)行沒有關(guān)系,反正最終的結(jié)果是一樣的,但是在多線程的情況下,非常有可能出現(xiàn)你不想看到的情形,比如x=0、y=0的情況,比如在預(yù)知中沒有這種情況,但是多線程的情況下,會出現(xiàn),所以一定會影響整個多線程程序的運行,單線程的程序不會影響。

有了as-if-serial(看上去像序列化的)指令就可以隨便變換順序,只要維持最終一致性即可;單線程的重排序只需要保證最終的一致性,比如a=b、y=1,隨便重排序,只要能保證單線程的最終一致性。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5301

    瀏覽量

    119862
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10813

    瀏覽量

    210880
  • 指令
    +關(guān)注

    關(guān)注

    1

    文章

    606

    瀏覽量

    35618
  • 緩存
    +關(guān)注

    關(guān)注

    1

    文章

    229

    瀏覽量

    26635
  • 線程
    +關(guān)注

    關(guān)注

    0

    文章

    504

    瀏覽量

    19636
收藏 人收藏

    評論

    相關(guān)推薦

    單片機執(zhí)行指令過程詳解

    因為指令是要求把取得的數(shù)送到A累加器,所以取出的數(shù)字經(jīng)內(nèi)部數(shù)據(jù)總線進入A累加器,而不是進入指令寄存器。至此,一條指令執(zhí)行完畢。單片機中PC=0002H,PC在
    的頭像 發(fā)表于 02-15 09:53 ?1.9w次閱讀

    CPU指令的條件執(zhí)行分享!

    ,是LE標志:恰巧,在print中有puts函數(shù),puts函數(shù)中有判斷,正好改變了CPSR中的高四位,使CPU執(zhí)行該異常指令。再說一句,CPU執(zhí)行
    發(fā)表于 09-10 05:45

    以Nehalem微架構(gòu)為參照說明Cache Memory指令執(zhí)行過程

    一假象迷惑,認為CPU亂序執(zhí)行僅與硬件流水線相關(guān),并不會影響軟件程序。事實并非如此。微架構(gòu)為了實現(xiàn)亂序執(zhí)行,有些
    發(fā)表于 09-01 16:05

    CPU周期與微指令周期的關(guān)系

    CPU周期與微指令周期的關(guān)系 在串行方式的微程序控制器中:       微指令周期 = 讀出微指令的時間 +
    發(fā)表于 03-26 16:16 ?35次下載

    什么是CPU分枝/亂序執(zhí)行?

    什么是分枝/亂序執(zhí)行?   分枝(branch)是指程序運行時需要改變的節(jié)點。分枝有無條件分枝和有條件分枝,其中無條件分枝只
    發(fā)表于 02-04 10:49 ?866次閱讀

    cpu執(zhí)行指令的過程詳解

    計算機每執(zhí)行一條指令都可分為三個階段進行。即取指令-----分析指令-----執(zhí)行指令。
    的頭像 發(fā)表于 03-09 16:30 ?10.3w次閱讀
    <b class='flag-5'>cpu</b><b class='flag-5'>執(zhí)行</b><b class='flag-5'>指令</b>的過程詳解

    CPU操作指令詳解

    CPU將CS:IP指向的內(nèi)存單元中的內(nèi)容看作指令,因為,在任何時候,CPU將CS,IP中的內(nèi)容當作指令的段地址和偏移地址,用它們合成指令的物
    的頭像 發(fā)表于 09-24 17:52 ?9801次閱讀

    80C51單片機指令的取指和執(zhí)行時序詳細說明

    現(xiàn)按4類指令介紹CPU時序。因為CPU工作的過程就是取指令執(zhí)行指令的過程,所以
    發(fā)表于 09-27 17:16 ?1次下載
    80C51單片機<b class='flag-5'>指令</b>的取指和<b class='flag-5'>執(zhí)行</b>時序詳細說明

    嵌入式RISC-V亂序執(zhí)行處理器的設(shè)計方案

    具有順序單發(fā)射、亂序執(zhí)行、亂序寫回等特性的三級流水線結(jié)構(gòu),運用哈佛體系結(jié)構(gòu)及AHB總線協(xié)議,可滿足并行訪問指令與數(shù)據(jù)的需求。在 Artix-7(XC7A35T-L1CSG324FPGA
    發(fā)表于 03-11 10:57 ?17次下載
    嵌入式RISC-V<b class='flag-5'>亂序</b><b class='flag-5'>執(zhí)行</b>處理器的設(shè)計方案

    超標量處理器的指令亂序提交機制綜述

    針對超標量處理器中長周期執(zhí)行指令延遲退休及持續(xù)譯碼導致的重排序緩存(ROB)阻塞問題,提出一種指令亂序提交機制。通過設(shè)計容量可配置的多緩存指令
    發(fā)表于 06-07 11:39 ?13次下載

    CPU指令執(zhí)行過程 CPU指令流水線

    幾乎所有的馮·諾伊曼型計算機的 CPU,其工作都可以分為 5 個階段:取指令、指令譯碼、執(zhí)行指令、訪存取數(shù)、結(jié)果寫回。
    發(fā)表于 05-09 17:29 ?1.8w次閱讀
    <b class='flag-5'>CPU</b><b class='flag-5'>指令</b>的<b class='flag-5'>執(zhí)行</b>過程 <b class='flag-5'>CPU</b><b class='flag-5'>指令</b>流水線

    如何證明CPU指令亂序執(zhí)行的呢?

    雙擊QQ.exe從磁盤加載到內(nèi)存里面,內(nèi)存里面就會有了一個進程,進程產(chǎn)生的時候會產(chǎn)生一個主線程,就是main方法所在的線程
    的頭像 發(fā)表于 03-15 09:14 ?1127次閱讀

    當我們在談?wù)?b class='flag-5'>cpu指令亂序的時候,究竟在談?wù)撌裁矗?/a>

    知道指令亂序策略很重要,原因是這樣我們就能夠通過barrier(內(nèi)存屏障)等指令,在正確的位置告訴cpu或者是編譯器,這里我可以接受亂序,
    的頭像 發(fā)表于 05-19 14:42 ?1252次閱讀
    當我們在談?wù)?b class='flag-5'>cpu</b><b class='flag-5'>指令</b><b class='flag-5'>亂序</b>的時候,究竟在談?wù)撌裁矗? />    </a>
</div>                            <div   id=

    編譯器的亂序策略

    寫這篇文章的目的,是想明確下cpu指令亂序這件事。只要是熟悉計算機底層系統(tǒng)的同學就會知道,程序里面的每行代碼的執(zhí)行順序,有可能會被編譯器和cpu
    的頭像 發(fā)表于 05-19 14:46 ?674次閱讀
    編譯器的<b class='flag-5'>亂序</b>策略

    cpu執(zhí)行程序內(nèi)部變化

    CPU(Central Processing Unit)是計算機的核心部件之一,它負責執(zhí)行計算機程序的指令,并進行數(shù)據(jù)處理和控制操作。CPU執(zhí)行
    的頭像 發(fā)表于 12-05 11:26 ?580次閱讀