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

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

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

當(dāng)我們?cè)谡務(wù)揷pu指令亂序的時(shí)候,究竟在談?wù)撌裁矗?/h1>

很多現(xiàn)代高級(jí)語(yǔ)言多提供了多線程并發(fā)技術(shù),今天服務(wù)器CPU基本上都是多核架構(gòu),在Java中,JVM能夠根據(jù)處理器特性(CPU多級(jí)緩存系統(tǒng)、多核處理器等)適當(dāng)對(duì)機(jī)器指令進(jìn)行重排序,最大限度發(fā)揮機(jī)器性能。Java中的指令重排有兩次,第一次發(fā)生在將字節(jié)碼編譯成機(jī)器碼的階段,第二次發(fā)生在CPU執(zhí)行的時(shí)候,也會(huì)適當(dāng)對(duì)指令進(jìn)行重排。

寫(xiě)這篇文章的目的,是想明確下cpu指令亂序這件事。只要是熟悉計(jì)算機(jī)底層系統(tǒng)的同學(xué)就會(huì)知道,程序里面的每行代碼的執(zhí)行順序,有可能會(huì)被編譯器和cpu根據(jù)某種策略,給打亂掉,目的是為了性能的提升,讓指令的執(zhí)行能夠盡可能的并行起來(lái)。

知道指令的亂序策略很重要,原因是這樣我們就能夠通過(guò)barrier(內(nèi)存屏障)等指令,在正確的位置告訴cpu或者是編譯器,這里我可以接受亂序,那里我不能接受亂序等等。從而,能夠在保證代碼正確性的前提下,最大限度地發(fā)揮機(jī)器的性能。

10多年前的程序員對(duì)處理器亂序執(zhí)行和內(nèi)存屏障應(yīng)該是很熟悉的,但隨著計(jì)算機(jī)技術(shù)突飛猛進(jìn)的發(fā)展,我們離底層原理越來(lái)越遠(yuǎn),這并不是一件壞事,但在有些情況下了解一些底層原理有助于我們更好的工作,比如現(xiàn)代高級(jí)語(yǔ)言多提供了多線程并發(fā)技術(shù),如果不深入下來(lái),那么有些由多線程造成問(wèn)題就很難排查和理解。

前言

這里我不打算討論編譯器的亂序策略,這里討論的指令亂序,含義稍廣些,包括在多核上分別執(zhí)行的指令間,在時(shí)間維度上的亂序。

如果在多核cpu層面考慮亂序執(zhí)行的話,我們要來(lái)梳理清楚以下幾個(gè)概念:?jiǎn)魏撕投嗪?,亂序執(zhí)行和順序提交,store buffer和invalid queue。最后會(huì)對(duì)x86和arm/power架構(gòu)的異同,做一個(gè)總結(jié)。

24a2495e-f5fc-11ed-90ce-dac502259ad0.jpg

單核 vs 多核

從多核的視角上來(lái)說(shuō),是存在著亂序的可能的。比如,假設(shè)存在變量x = 0,cpu0上執(zhí)行寫(xiě)入W0(x, 1),對(duì)x寫(xiě)入1。接著在cpu1上,執(zhí)行讀取R1(x, 0),得到x = 0,這在x86和arm/power的cpu上都是可能出現(xiàn)的。原因是x86上cpu核和cache以及內(nèi)存之間,存在著store buffer,當(dāng)W0(x, 1)執(zhí)行成功后,修改只存在于store buffer中,并未寫(xiě)到cache以及內(nèi)存上,因此cpu1讀取不到最新的x值。對(duì)于arm/power來(lái)說(shuō),同樣也有store buffer,而且還可能會(huì)有invalid queue,導(dǎo)致cpu1讀不到最新的x值。

對(duì)于沒(méi)有invalid queue的x86系列cpu來(lái)說(shuō),當(dāng)修改從store buffer刷入cache時(shí),就能夠保證在其他核上能夠讀到最新的修改。但是,對(duì)于存在invalid queue的cpu來(lái)說(shuō),則不一定。

為了能夠保證多核之間的修改的可見(jiàn)性,我們?cè)趯?xiě)程序的時(shí)候需要加上內(nèi)存屏障,例如x86上的mfence指令。

亂序執(zhí)行 vs 順序提交

我們知道,在cpu中為了能夠讓指令的執(zhí)行盡可能地并行起來(lái),從而發(fā)明了流水線技術(shù)。但是如果兩條指令的前后存在依賴(lài)關(guān)系,比如數(shù)據(jù)依賴(lài),控制依賴(lài)等,此時(shí)后一條語(yǔ)句就必需等到前一條指令完成后,才能開(kāi)始。

cpu為了提高流水線的運(yùn)行效率,會(huì)做出比如:

1)對(duì)無(wú)依賴(lài)的前后指令做適當(dāng)?shù)膩y序和調(diào)度;

2)對(duì)控制依賴(lài)的指令做分支預(yù)測(cè);

3)對(duì)讀取內(nèi)存等的耗時(shí)操作,做提前預(yù)讀;

等等。以上總總,都會(huì)導(dǎo)致指令亂序的可能。

但是對(duì)于x86的cpu來(lái)說(shuō),在單核視角上,其實(shí)它做出了Sequential consistency[1]的一致性保障。Sequential consistency的在wiki上的定義如下:

"... the result of any execution is the same as if the operations of all the processors were executed in some sequential order, and the operations of each individual processor appear in this sequence in the order specified by its program."

也就是說(shuō),要滿(mǎn)足Sequential consistency,必需保障每個(gè)處理器的指令執(zhí)行順序必需和程序給出的順序一致。奇怪吧?這不就和我剛才說(shuō)的指令亂序優(yōu)化矛盾了嘛?其實(shí)并不矛盾,指令在cpu核內(nèi)部確實(shí)是亂序執(zhí)行和調(diào)度的,但是它們對(duì)外表現(xiàn)卻是順序提交的。

如果把ISA寄存器(如EAX,EBX等)和store buffer,作為cpu對(duì)外的接口的話,cpu只需要把內(nèi)部真實(shí)的物理寄存器按照指令的執(zhí)行順序,順序映射到ISA寄存器上,也就是cpu只要將結(jié)果順序地提交到ISA寄存器,就可以保證Sequential consistency。

當(dāng)然,以上是對(duì)x86架構(gòu)的cpu來(lái)說(shuō)的,ARM/Power架構(gòu)的cpu在單核上的一致性保證要弱一些,無(wú)需保證Sequential consistency,因此也不需要順序提交,只需保證控制依賴(lài),數(shù)據(jù)依賴(lài),地址依賴(lài)等指令的順序即可。要想在這些弱一致性模型cpu下保證無(wú)關(guān)指令間的提交順序,需要使用barrier指令。

Store Buffer & Invalid Queue

store buffer存在于cpu核與cache之間,對(duì)于x86架構(gòu)來(lái)說(shuō),store buffer是FIFO,因此不會(huì)存在亂序,寫(xiě)入順序就是刷入cache的順序。但是對(duì)于ARM/Power架構(gòu)來(lái)說(shuō),store buffer并未保證FIFO,因此先寫(xiě)入store buffer的數(shù)據(jù),是有可能比后寫(xiě)入store buffer的數(shù)據(jù)晚刷入cache的。從這點(diǎn)上來(lái)說(shuō),store buffer的存在會(huì)讓ARM/Power架構(gòu)出現(xiàn)亂序的可能。store barrier存在的意義就是將store buffer中的數(shù)據(jù),刷入cache。

在某些cpu中,存在invalid queue。invalid queue用于緩存cache line的失效消息,也就是說(shuō),當(dāng)cpu0寫(xiě)入W0(x, 1),并從store buffer將修改刷入cache,此時(shí)cpu1讀取R1(x, 0)仍是允許的。因?yàn)槭筩ache line失效的消息被緩沖在了invalid queue中,還未被應(yīng)用到cache line上。這也是一種會(huì)使得指令亂序的可能。load barrier存在的意義就是將invalid queue緩沖刷新。

X86 vs ARM/Power

對(duì)于x86架構(gòu)的cpu來(lái)說(shuō),在單核上來(lái)看,其保證了Sequential consistency,因此對(duì)于開(kāi)發(fā)者,我們可以完全不用擔(dān)心單核上的亂序優(yōu)化會(huì)給我們的程序帶來(lái)正確性問(wèn)題。在多核上來(lái)看,其保證了x86-tso模型,使用mfence就可以將store buffer中的數(shù)據(jù),寫(xiě)入到cache中。而且,由于x86架構(gòu)下,store buffer是FIFO的和不存在invalid queue,mfence能夠保證多核間的數(shù)據(jù)可見(jiàn)性,以及順序性。[2]

對(duì)于arm和power架構(gòu)的cpu來(lái)說(shuō),編程就變得危險(xiǎn)多了。除了存在數(shù)據(jù)依賴(lài),控制依賴(lài)以及地址依賴(lài)等的前后指令不能被亂序之外,其余指令間都有可能存在亂序。而且,它們的store buffer并不是FIFO的,而且還可能存在invalid queue,這些也同樣讓并發(fā)編程變得困難重重。因此需要引入不同類(lèi)型的barrier來(lái)完成不同的需求。[3]

總結(jié)

從上面的介紹可以知道,開(kāi)發(fā)者想要做好并發(fā)編程是多么困難的事情,但是我們至少跨出了第一步,也就是定義困難本身。

審核編輯 :李倩

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

    關(guān)注

    68

    文章

    18927

    瀏覽量

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

    關(guān)注

    68

    文章

    10702

    瀏覽量

    209385
  • 多線程
    +關(guān)注

    關(guān)注

    0

    文章

    275

    瀏覽量

    19850
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    CYW20704能否支持Tethering呢?

    CYW20704 能否支持 Tethering? 如果是,有什么指導(dǎo)原則或文件在談?wù)?/b>它嗎? 如果沒(méi)有,如何幫助客戶(hù)找到它?
    發(fā)表于 06-04 09:31

    談?wù)?/b>MCU上運(yùn)行什么樣的應(yīng)用

    作者| Rober van der Zwan(荷蘭)譯者|禾沐當(dāng)我們談?wù)?/b>使用MCU的嵌入式系統(tǒng)時(shí),我們在談?wù)?/b>MCU上運(yùn)行什么樣的應(yīng)用?眾所周知,我們
    發(fā)表于 12-22 08:19

    Lovepedal SuperSix資料分享

    非常適合緩沖、放大或收集聲音。為您的吉他設(shè)置添加柔和的復(fù)古壓縮或復(fù)古音色。Lovepedal Super 6 不是過(guò)載踏板,但在極端設(shè)置下可能會(huì)增加一些額外的功能。它也增加了壓縮,但我們不是在談?wù)?/b>
    發(fā)表于 08-12 06:50

    網(wǎng)友談?wù)?/b>:Coolmos的選擇與優(yōu)勢(shì)

    電子發(fā)燒友網(wǎng)整理了網(wǎng)友針對(duì)Coolmos的選型及優(yōu)勢(shì)的一些談?wù)?/b>,方便大家參考
    發(fā)表于 06-20 16:10 ?8806次閱讀

    關(guān)于智慧銀行,我們在談?wù)?/b>著什么?

    英特爾公司中國(guó)區(qū)物聯(lián)網(wǎng)產(chǎn)品營(yíng)銷(xiāo)部產(chǎn)品經(jīng)理徐民先生表示:“智慧銀行是一個(gè)利用信息技術(shù)(云計(jì)算、大數(shù)據(jù)、互聯(lián)網(wǎng)、智能設(shè)備等)提高銀行的管理水平和運(yùn)營(yíng)效率,實(shí)現(xiàn)產(chǎn)品創(chuàng)新、服務(wù)創(chuàng)新,更好地為客戶(hù)提供金融服務(wù)的系統(tǒng)工程,可以說(shuō)英特爾為智慧的銀行發(fā)展提供云網(wǎng)端的產(chǎn)品和技術(shù)支持?!?/div>
    發(fā)表于 07-01 14:32 ?4887次閱讀

    Michael I. Jordan給AI潑冷水,人工智能革命尚未發(fā)生

    當(dāng)我們在談?wù)?/b> AI 時(shí),我們到底在談什么?人工智能三度崛起,所有的人張口閉口都是 AI,媒體的炒作讓人看到未來(lái)仿佛已經(jīng)來(lái)到我們的身邊。
    的頭像 發(fā)表于 04-27 14:37 ?3796次閱讀

    我們的生活與大數(shù)據(jù)關(guān)聯(lián)在一起,確保信息安全極為重要

    大數(shù)據(jù)的研究和探討我們持續(xù)了快一個(gè)季度了,現(xiàn)在我們在談?wù)?/b>大數(shù)據(jù)和云計(jì)算,而我們在談?wù)?/b>的過(guò)程當(dāng)中有一點(diǎn)是無(wú)論如何也繞不開(kāi)的也無(wú)法避免的問(wèn)題,
    發(fā)表于 06-20 11:30 ?1529次閱讀

    我們是不是要信任智慧城市?

    我們需要確保我們在談?wù)?/b>正確的事情,發(fā)出正確的指令我們可以相信它們告訴我們的事情,并且它們會(huì)遵
    的頭像 發(fā)表于 06-25 08:39 ?3427次閱讀

    科技巨頭扎堆 是什么催化了AIoT時(shí)代的到來(lái)

    有人形容AIoT是一個(gè)大的硬件生態(tài)、是一個(gè)全新的技術(shù)浪潮,是一個(gè)宏大的未來(lái)藍(lán)圖。那么,當(dāng)我們在談?wù)?/b>AIoT的時(shí)候,我們到底在說(shuō)什么?又是什么,催化了AIoT時(shí)代的到來(lái)?
    的頭像 發(fā)表于 01-23 14:12 ?4038次閱讀

    科技巨頭扎堆AIoT,華為、小米究竟看到了什么?

    編者按 :有人形容AIoT是一個(gè)大的硬件生態(tài)、是一個(gè)全新的技術(shù)浪潮,是一個(gè)宏大的未來(lái)藍(lán)圖。那么,當(dāng)我們在談?wù)?/b>AIoT的時(shí)候,我們到底在說(shuō)什么?又是什么,催化了AIoT時(shí)代的到來(lái)? 20
    的頭像 發(fā)表于 01-27 16:01 ?789次閱讀

    All in AIoT,華為、小米、曠視們究竟在打什么主意?

    、是一個(gè)全新的技術(shù)浪潮,是一個(gè)宏大的未來(lái)藍(lán)圖。那么,當(dāng)我們在談?wù)?/b>AIoT的時(shí)候,我們到底在說(shuō)什么?又是什么,催化了AIoT時(shí)代的到來(lái)? 我們
    的頭像 發(fā)表于 01-27 16:28 ?634次閱讀

    每個(gè)人都在談?wù)?/b>的物聯(lián)網(wǎng)究竟在哪里

    物聯(lián)網(wǎng)(IoT)越來(lái)越受歡迎。所有與IT相關(guān)的網(wǎng)站都發(fā)表了許多與智能家居、連網(wǎng)汽車(chē)、工業(yè)物聯(lián)網(wǎng)、可穿戴設(shè)備、新技術(shù)以及物聯(lián)網(wǎng)標(biāo)準(zhǔn)相關(guān)的文章。還有很多大眾媒體也越來(lái)越多地報(bào)道物聯(lián)網(wǎng)的巨大潛力,許多報(bào)道稱(chēng)其市場(chǎng)規(guī)模巨大,是下一件不可忽視的大事。
    的頭像 發(fā)表于 02-14 09:43 ?2879次閱讀

    當(dāng)我們在談?wù)?/b>中美領(lǐng)跑人工智能競(jìng)賽的時(shí)候,日本在干什么?

    人工智能技術(shù)還有望用于犯罪調(diào)查和維持社會(huì)治安,日本警察廳將從今年開(kāi)始這方面的實(shí)驗(yàn)。實(shí)驗(yàn)中將摸索能否通過(guò)監(jiān)控?cái)z像頭圖像鎖定汽車(chē)車(chē)型或在人群中發(fā)現(xiàn)可疑人員。日本媒體稱(chēng)如果能順利實(shí)現(xiàn),未來(lái)或?qū)⒄Q生能解決任何疑難案件的“人工智能刑警”。
    的頭像 發(fā)表于 03-08 16:22 ?4129次閱讀

    AI詩(shī)人和人類(lèi)詩(shī)人,哪個(gè)更勝一籌?

    當(dāng)前我們在談?wù)?/b>AI寫(xiě)的詩(shī)好不好的時(shí)候,也忘了一個(gè)問(wèn)題:未來(lái)人類(lèi)是否愿意讀AI的詩(shī)?
    發(fā)表于 07-02 17:19 ?1288次閱讀

    我們在談?wù)?/b>音質(zhì)的時(shí)候在談?wù)?/b>什么資料下載

    電子發(fā)燒友網(wǎng)為你提供我們在談?wù)?/b>音質(zhì)的時(shí)候在談?wù)?/b>什么資料下載的電子資料下載,更有其他相關(guān)的電路圖、源代碼、課件教程、中文資料、英文資料、參考設(shè)計(jì)、用戶(hù)指南、解決方案等資料,希望可以幫助到
    發(fā)表于 04-25 08:45 ?10次下載
    <b class='flag-5'>我們</b><b class='flag-5'>在談?wù)?/b>音質(zhì)的<b class='flag-5'>時(shí)候</b><b class='flag-5'>在談?wù)?/b>什么資料下載