完了!CPU一味求快出事兒了!
本文轉(zhuǎn)載自微信公眾號(hào)「編程技術(shù)宇宙」,轉(zhuǎn)載本文請(qǐng)聯(lián)系編程技術(shù)宇宙公眾號(hào)。
自我介紹我叫阿Q,是CPU一號(hào)車間里的員工,我所在的這個(gè)CPU足足有8個(gè)核,就有8個(gè)車間,干起活來(lái)杠杠滴。
我所在的一號(hào)車間里,除了負(fù)責(zé)執(zhí)行指令的我,還有負(fù)責(zé)取指令的小A,負(fù)責(zé)分析指令的小胖和負(fù)責(zé)結(jié)果回寫(xiě)的老K。
CPU的每個(gè)車間都有一堆箱子,人們把這些箱子叫做寄存器,我所在的一號(hào)車間也不例外,我們每天的工作就是不斷執(zhí)行指令,然后折騰這些箱子,往里面存東西取東西。
由于我們四個(gè)人的出色工作,一號(hào)車間業(yè)績(jī)突出,在年會(huì)上還多次獲得了最佳CPU核心獎(jiǎng)呢。
緩存我們每天都需要跟內(nèi)存打交道,不過(guò)由于內(nèi)存這家伙實(shí)在太慢了,我們浪費(fèi)了很多時(shí)間等待他給我們數(shù)據(jù)傳輸。
終于有一天,上面給我們下了命令,說(shuō)競(jìng)爭(zhēng)對(duì)手CPU的速度快趕上我們了,讓我們想辦法提升工作效率。這一下可難倒了我們,我們平時(shí)干活絕沒(méi)有偷懶,要怪只能怪內(nèi)存那家伙,是他拖了我們后腿。
一天晚上,我們哥四個(gè)在一起聚餐,討論起上面的這道命令來(lái),大家都紛紛嘆氣。
就在一籌莫展之際,老K提出了一個(gè)想法:“兄弟們,我發(fā)現(xiàn)了一個(gè)現(xiàn)象,咱們和內(nèi)存打交道的時(shí)候,如果訪問(wèn)了某個(gè)地址的數(shù)據(jù),它周圍的數(shù)據(jù)隨后也大概率會(huì)被訪問(wèn)到”,說(shuō)到這里,老K停頓了一下。
我一邊聽(tīng)一邊想著,小A倒是先開(kāi)口:“然后呢?你想表達(dá)什么意思?”
老K繼續(xù)說(shuō)道:“咱每次數(shù)據(jù)都找內(nèi)存要,太慢了,我尋思在咱們車間劃一塊區(qū)域,結(jié)合我發(fā)現(xiàn)的那個(gè)現(xiàn)象,以后讓內(nèi)存一次性把目標(biāo)區(qū)域附近的數(shù)據(jù)一起給我們,我們存在這塊區(qū)域,后面在需要用到的時(shí)候就先去這里找,找不到再去找內(nèi)存要,豈不省事?”
聽(tīng)老K這么一描述,感覺(jué)靠譜,我也趕緊附和:“好辦法!你們看啊,這內(nèi)存老是拖咱后退,但是這家伙一時(shí)半會(huì)也快不起來(lái),要不咱先用這招試試,看看能不能加快一點(diǎn)工作效率,給上面也有個(gè)交代。”
說(shuō)干就干,我們很快就付諸實(shí)踐了,我們還給這技術(shù)取了個(gè)名字叫緩存,效果居然出奇的好,后來(lái)為了進(jìn)一步優(yōu)化,我們還把緩存分為了兩塊,一塊離寄存器很近叫一級(jí)緩存,剩下的叫二級(jí)緩存。一級(jí)緩存中進(jìn)一步分了指令緩存和數(shù)據(jù)緩存兩塊。
我們車間的工作效率那是飛速提升,但不知道是誰(shuí)走漏了風(fēng)聲,其他幾個(gè)車間也知道了這項(xiàng)技術(shù),紛紛效仿。
這天,為了業(yè)績(jī),我們決定再加第三級(jí)緩存,這次把空間弄大點(diǎn),不過(guò)咱們車間地盤(pán)有點(diǎn)局促,放不下,我們偷偷給上面領(lǐng)導(dǎo)反饋了這事兒,想讓領(lǐng)導(dǎo)幫我們協(xié)調(diào)一下。
領(lǐng)導(dǎo)倒是同意了,不過(guò)告訴我們他得一碗水端平,平衡各車間的利益。但是咱廠里空間也有限,不可能給每個(gè)車間都分配那么大的空間,于是決定由廠里統(tǒng)一安排一塊大的區(qū)域,讓各個(gè)車間來(lái)共享。沒(méi)有辦法,我們也只好同意了。
現(xiàn)在,我們用上了三級(jí)緩存技術(shù),內(nèi)存那家伙拖后腿的現(xiàn)象緩解了不少,相當(dāng)部分時(shí)間我們都能從這三級(jí)緩存里面找到我們需要的數(shù)據(jù)。
亂序執(zhí)行隨著技術(shù)的發(fā)展,咱們CPU工廠的工作性能也是不斷攀升,慢慢的,我們幾個(gè)又開(kāi)始閑下來(lái)了,因?yàn)槲覀儗?shí)在太快了,盡管有了緩存,但我們還是有了不少閑暇時(shí)間。
這天我還是像往常一樣,小A取指令去了,我們知道這得要點(diǎn)時(shí)間,于是我和小胖還有老K我們仨斗起了地主。
打了好幾把,小A才氣喘吁吁的回來(lái),“小胖,該你去指令分析了,你起來(lái)讓我來(lái)打幾把”。小胖趕緊起身干活,換上了小A上桌。
就這樣我們幾個(gè)輪流工作,一直保持著三個(gè)人的斗地主牌桌。
沒(méi)想到的是,沒(méi)過(guò)多久,廠里領(lǐng)導(dǎo)過(guò)來(lái)視察了,正好撞見(jiàn)我們幾個(gè)打牌,狠狠的訓(xùn)斥了我們一頓。
“你們幾個(gè)上班時(shí)間玩得挺嗨啊”,領(lǐng)導(dǎo)的臉拉的老長(zhǎng)。
“領(lǐng)導(dǎo),我們沒(méi)有偷懶,這取指令、譯碼、執(zhí)行、回寫(xiě)幾個(gè)步驟都得分步執(zhí)行,但是我們工作太快,存儲(chǔ)器跟不上我們,我們等得無(wú)聊打發(fā)時(shí)間嘛”,我上前解釋到。
“干等著你們也可以提前做一些后面的準(zhǔn)備工作嘛,不要浪費(fèi)時(shí)間,讓生產(chǎn)效率更上一層樓”,領(lǐng)導(dǎo)說(shuō)完就離開(kāi)了,留下我們幾個(gè)面面相覷。
不過(guò)領(lǐng)導(dǎo)的一番話倒是如一記重錘敲在我的頭上,對(duì)啊,我們有這打牌的時(shí)間不如提前把后續(xù)指令的準(zhǔn)備工作先做了,肯定能提升不少效率呢!
我開(kāi)始組織兄弟幾個(gè)商討方案,“兄弟們,我們最主要的時(shí)間都浪費(fèi)在等待內(nèi)存數(shù)據(jù)上了,如果我們能在等待的時(shí)間里把后續(xù)指令需要的數(shù)據(jù)提前準(zhǔn)備到緩存中來(lái),那可就節(jié)約不少時(shí)間了,不用每次都等那么久。”
老K聽(tīng)后很贊賞我的思路,并補(bǔ)充到:“不僅是準(zhǔn)備工作,像有些指令,比如加法,如果參與加法的數(shù)據(jù)不依賴前面指令的結(jié)果,咱們完全可以提前把這加法指令執(zhí)行了嘛,把結(jié)果保存在緩存中,等真正輪到這條指令執(zhí)行的時(shí)候,再把緩存中的結(jié)果寫(xiě)到內(nèi)存中,這不也是節(jié)約了時(shí)間嗎”
大家開(kāi)始頭腦風(fēng)暴起來(lái),原來(lái)可以做的事情還這么多,之前光想著等靠要,現(xiàn)在要主動(dòng)出擊了,因?yàn)榇騺y了順序提前會(huì)執(zhí)行后面的指令,我們把這個(gè)技術(shù)叫做亂序執(zhí)行.
“這次大家要保密哦,不能讓隔壁車間知道咱們的這次討論內(nèi)容”,會(huì)議結(jié)束前,我提醒大家。
分支預(yù)測(cè)按照這次會(huì)議討論的結(jié)果,咱們第二天準(zhǔn)備實(shí)行,不過(guò)剛一開(kāi)始,就遇到了麻煩。
按照計(jì)劃,我們?cè)诳臻e時(shí)間里,會(huì)提前把后續(xù)要執(zhí)行的指令能做的工作先做了,但麻煩的是我們遇到了一條判斷指令,因?yàn)椴恢雷罱K結(jié)果是true還是false,我們沒(méi)法知道后續(xù)是應(yīng)該執(zhí)行分支A的指令還是分支B的指令。不敢輕舉妄動(dòng),怕一會(huì)做了無(wú)用功。
大家只好放棄了提前做準(zhǔn)備工作的想法,還是一步步來(lái)。
不過(guò)很快我們發(fā)現(xiàn),我們經(jīng)常執(zhí)行到這個(gè)判斷指令,而且每次結(jié)果都是去執(zhí)行A分支,從沒(méi)有去過(guò)B分支。
于是我們幾個(gè)又商量,發(fā)明了一種叫分支預(yù)測(cè)的技術(shù),遇到分支跳轉(zhuǎn)時(shí),按照之前的經(jīng)驗(yàn),如果某個(gè)分支經(jīng)常被執(zhí)行,那后續(xù)再去這個(gè)分支的概率一定很大,那這樣咱們預(yù)測(cè)后面會(huì)去到這個(gè)分支,就提前把這個(gè)分支后面指令能做的工作先做了。
果然,用上了分支預(yù)測(cè)和亂序執(zhí)行后,我們車間的效率又狠狠的提升了一把,在工廠的集體大會(huì)上又一次表?yè)P(yáng)了我們,并且把我們的先進(jìn)技術(shù)向全廠推廣。