日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時(shí)間:2024/4/11 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 当我们在谈论cpu指令乱序的时候,究竟在谈论什么? 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原文:https://zhuanlan.zhihu.com/p/45808885


背景

在極客星球的群里面討論

??極客星球

很多現(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ě)這篇文章的目的,正如題目所說(shuō),是想明確下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)題就很難排查和理解

前言

這里我不打算討論編譯器的亂序策略,后續(xù)有機(jī)會(huì)會(huì)寫(xiě)專門的文章來(lái)討論,否則就太亂了。而且,這里討論的指令亂序,含義稍廣些,包括在多核上分別執(zhí)行的指令間,在時(shí)間維度上的亂序。如果在多核cpu層面考慮亂序執(zhí)行的話,我們要來(lái)梳理清楚以下幾個(gè)概念:單核多核亂序執(zhí)行順序提交store bufferinvalid queue。最后會(huì)對(duì)x86arm/power架構(gòu)的異同,做一個(gè)總結(jié)。

單核 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ù)。但是如果兩條指令的前后存在依賴關(guān)系,比如數(shù)據(jù)依賴,控制依賴等,此時(shí)后一條語(yǔ)句就必需等到前一條指令完成后,才能開(kāi)始。

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

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

2)對(duì)控制依賴的指令做分支預(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ō),要滿足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,因此也不需要順序提交,只需保證控制依賴,數(shù)據(jù)依賴,地址依賴等指令的順序即可。要想在這些弱一致性模型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ù)依賴,控制依賴以及地址依賴等的前后指令不能被亂序之外,其余指令間都有可能存在亂序。而且,它們的store buffer并不是FIFO的,而且還可能存在invalid queue,這些也同樣讓并發(fā)編程變得困難重重。因此需要引入不同類型的barrier來(lái)完成不同的需求。[3]

總結(jié)

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

Reference

[1] Lamport, Leslie. "How to make a multiprocessor computer that correctly executes multiprocess progranm." IEEE transactions on computers 9 (1979): 690-691.

[2] Sewell, Peter, et al. "x86-TSO: a rigorous and usable programmer's model for x86 multiprocessors." Communications of the ACM 53.7 (2010): 89-97.

[3] Maranget, Luc, Susmit Sarkar, and Peter Sewell. "A tutorial introduction to the ARM and POWER relaxed memory models." Draft available from http://www. cl. cam. ac. uk/~ pes20/ppc-supplemental/test7. pdf (2012).

- END -


看完一鍵三連在看轉(zhuǎn)發(fā)點(diǎn)贊

是對(duì)文章最大的贊賞,極客重生感謝你

推薦閱讀

定個(gè)目標(biāo)|建立自己的技術(shù)知識(shí)體系


大廠后臺(tái)開(kāi)發(fā)基本功修煉路線和經(jīng)典資料


簡(jiǎn)歷的本質(zhì)


你好,這里是極客重生,我是阿榮,大家都叫我榮哥,從華為->外企->到互聯(lián)網(wǎng)大廠,目前是大廠資深工程師,多次獲得五星員工,多年職場(chǎng)經(jīng)驗(yàn),技術(shù)扎實(shí),專業(yè)后端開(kāi)發(fā)和后臺(tái)架構(gòu)設(shè)計(jì),熱愛(ài)底層技術(shù),豐富的實(shí)戰(zhàn)經(jīng)驗(yàn),分享技術(shù)的本質(zhì)原理,希望幫助更多人蛻變重生,拿BAT大廠offer,培養(yǎng)高級(jí)工程師能力,成為技術(shù)專家,實(shí)現(xiàn)高薪夢(mèng)想,期待你的關(guān)注!點(diǎn)擊藍(lán)字查看我的成長(zhǎng)之路

校招/社招/簡(jiǎn)歷/面試技巧/大廠技術(shù)棧分析/后端開(kāi)發(fā)進(jìn)階/優(yōu)秀開(kāi)源項(xiàng)目/直播分享/技術(shù)視野/實(shí)戰(zhàn)高手等,?極客星球希望成為最有技術(shù)價(jià)值星球,盡最大努力為星球的同學(xué)提供技術(shù)和成長(zhǎng)幫助!詳情查看->極客星球

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 求點(diǎn)贊,在看,分享三連

總結(jié)

以上是生活随笔為你收集整理的当我们在谈论cpu指令乱序的时候,究竟在谈论什么?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 一级片少妇 | 玖玖zyz | 99999视频 | 四虎免费久久 | 无人码人妻一区二区三区免费 | 熟妇人妻av无码一区二区三区 | 人人操在线播放 | 欧美人与动物xxxx | 朝桐光av一区二区三区 | 日韩欧美中文字幕在线观看 | 一区二区在线观看视频 | 91精品福利| 婷婷玖玖 | 亚洲精品成人无码熟妇在线 | 亚洲九九精品 | 国产良妇出轨视频在线观看 | 性福利视频 | 污片在线免费看 | 日韩精品一区二区免费视频 | 一区二区三区波多野结衣 | 亚洲第一女人av | 亚洲国产精品久久精品怡红院 | 中文字幕亚洲专区 | 亚洲永久在线观看 | a极毛片 | 草草影院一区二区三区 | 亚洲911精品成人18网站 | 视频免费观看在线 | 精品人妻一区二区三区蜜桃 | 国产特黄毛片 | 亚洲一级影片 | 国产亚洲视频在线 | 超碰在线观看91 | 国产免费一级 | 日韩欧美亚洲综合 | 久久六六 | 亚洲天堂小视频 | 午夜精品久久久久久久久久久久久蜜桃 | 欧美私人影院 | 欧美三级理论片 | 伊人综合影院 | 欧美xxxx日本和非洲 | 国产综合在线播放 | 亚洲欧美在线观看视频 | 久久久国产打桩机 | 欧美日韩在线播放 | 女人私密又肥又大 | 国产精品视频你懂的 | 嫦娥性艳史bd | 日韩欧美精品中文字幕 | 丝袜脚交免费网站xx | 婷婷社区五月天 | 国产超碰在线观看 | 97超碰中文 | 夜夜艹 | 99成人在线 | 少妇又白又嫩又色又粗 | 久久99国产综合精品免费 | 国产chinese中国hdxxxx | 高中男男gay互囗交观看 | 拔插拔插海外华人永久免费 | 中文字幕乱码人妻无码久久 | 色婷婷av国产精品 | 夜夜嗨av禁果av粉嫩av懂色av | 蜜桃av导航 | 亚洲国产无码精品 | 国产欧美一级 | 一区二区在线视频 | 黑丝一区二区三区 | 午夜激情毛片 | 91成人品| 免费黄色a | 99爱精品视频 | 日韩1区| 久久3p | 日韩最新中文字幕 | www国产精品内射熟女 | 亚洲人午夜射精精品日韩 | 欧美不卡一区 | 欧美乱码精品一区二区三区 | 动漫3d精品一区二区三区乱码 | 伊人网色 | 久久精品国产亚洲av高清色欲 | 骚虎免费视频 | 亚洲最大综合网 | 一区二区三区黄色录像 | 在线亚洲人成电影网站色www | 嫩草视频网站 | 成人黄色短片 | 日韩有码一区二区三区 | 51成人做爰www免费看网站 | 粉色视频免费观看 | 拔插拔插海外华人免费视频 | 日本亚洲一区二区 | 草莓视频一区二区三区 | 在线精品视频一区 | 亚洲AV乱码国产精品观看麻豆 | 一品毛片 | 日韩亚洲欧美综合 |