自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

CPU發(fā)展史解密-內(nèi)存一致性模型

商務(wù)辦公
早期的CPU是通過提高主頻來提升CPU的性能,但是隨著頻率“紅利”越來越困難的情況下,廠商開始用多核來提高CPU的計算能力。多核是指一個CPU里有多個核心,在同一時間一個CPU能夠同時運行多個線程,通過這樣提高CPU的并發(fā)能力。

 早期的CPU是通過提高主頻來提升CPU的性能,但是隨著頻率“紅利”越來越困難的情況下,廠商開始用多核來提高CPU的計算能力。多核是指一個CPU里有多個核心,在同一時間一個CPU能夠同時運行多個線程,通過這樣提高CPU的并發(fā)能力。

[[280121]]

內(nèi)存一致性模型(memory consistency model)就是用來描述多線程對共享存儲器的訪問行為,在不同的內(nèi)存一致性模型里,多線程對共享存儲器的訪問行為有非常大的差別。這些差別會嚴重影響程序的執(zhí)行邏輯,甚至?xí)斐绍浖壿媶栴}。在后面的介紹中,我們將分析不同的一致性模型里,多線程的內(nèi)存訪問亂序問題。

目前有多種內(nèi)存一致性模型:

  • 順序存儲模型(sequential consistency model)
  • 完全存儲定序(total store order)
  • 部分存儲定序(part store order)
  • 寬松存儲模型(relax memory order)

一致性模型的特性

在后面我們會分析這幾個一致性模型的特性

在分析之前,我們先定義一個基本的內(nèi)存模型,以這個內(nèi)存模型為基礎(chǔ)進行分析

 

CPU發(fā)展史解密-內(nèi)存一致性模型

 

上圖是現(xiàn)代CPU的基本內(nèi)存模型,CPU內(nèi)部有多級緩存來提高CPU的load/store訪問速度(因為對于CPU而言,主存的訪問速度太慢了,上百個時鐘周期的內(nèi)存訪問延遲會極大的降低CPU的使用效率,所以CPU內(nèi)部往往使用多級緩存來提升內(nèi)存訪問效率。)

C1與C2是CPU的2個核心,這兩個核心有私有緩存L1,以及共享緩存L2。最后一級存儲器才是主存。后面的順序一致性模型(SC)中,我們會以這個為基礎(chǔ)進行描述(在完全存儲定序、部分存儲定序和寬松內(nèi)存模型里會有所區(qū)別,后面會描述相關(guān)的部分)

為了簡化描述的復(fù)雜性,在下面的內(nèi)存一致性模型描述里,會先將緩存一致性(cache coherence)簡單化,認為緩存一致性是完美的(假設(shè)多核cache間的數(shù)據(jù)同步與單核cache一樣,沒有cache引起的數(shù)據(jù)一致性問題),以減少描述的復(fù)雜性。

順序存儲模型

順序存儲模型是最簡單的存儲模型,也稱為強定序模型。CPU會按照代碼來執(zhí)行所有的load與store動作,即按照它們在程序的順序流中出現(xiàn)的次序來執(zhí)行。從主存儲器和CPU的角度來看,load和store是順序地對主存儲器進行訪問。

下面分析這段代碼的執(zhí)行結(jié)果

 

CPU發(fā)展史解密-內(nèi)存一致性模型

 

在順序存儲器模型里,MP(多核)會嚴格嚴格按照代碼指令流來執(zhí)行代碼

所以上面代碼在主存里的訪問順序是:

  1. S1 S2 L1 L2 

通過上面的訪問順序我們可以看出來,雖然C1與C2的指令雖然在不同的CORE上運行,但是C1發(fā)出來的訪問指令是順序的,同時C2的指令也是順序的。雖然這兩個線程跑在不同的CPU上,但是在順序存儲模型上,其訪問行為與UP(單核)上是一致的。

我們最終看到r2的數(shù)據(jù)會是NEW,與期望的執(zhí)行情況是一致的,所以在順序存儲模型上是不會出現(xiàn)內(nèi)存訪問亂序的情況

完全存儲定序

為了提高CPU的性能,芯片設(shè)計人員在CPU中包含了一個存儲緩存區(qū)(store buffer),它的作用是為store指令提供緩沖,使得CPU不用等待存儲器的響應(yīng)。所以對于寫而言,只要store buffer里還有空間,寫就只需要1個時鐘周期(哪怕是ARM-A76的L1 cache,訪問一次也需要3個cycles,所以store buffer的存在可以很好的減少寫開銷),但這也引入了一個訪問亂序的問題。

首先我們需要對上面的基礎(chǔ)內(nèi)存模型做一些修改,表示這種新的內(nèi)存模型

相比于以前的內(nèi)存模型而言,store的時候數(shù)據(jù)會先被放到store buffer里面,然后再被寫到L1 cache里。

 

CPU發(fā)展史解密-內(nèi)存一致性模型

 

首先我們思考單核上的兩條指令:

  1. S1:store flag= set 
  2.     S2:load r1=data 
  3.     S3:store b=set 

如果在順序存儲模型中,S1肯定會比S2先執(zhí)行。但是如果在加入了store buffer之后,S1將指令放到了store buffer后會立刻返回,這個時候會立刻執(zhí)行S2。S2是read指令,CPU必須等到數(shù)據(jù)讀取到r1后才會繼續(xù)執(zhí)行。這樣很可能S1的store flag=set指令還在store buffer上,而S2的load指令可能已經(jīng)執(zhí)行完(特別是data在cache上存在,而flag沒在cache中的時候。這個時候CPU往往會先執(zhí)行S2,這樣可以減少等待時間)

這里就可以看出再加入了store buffer之后,內(nèi)存一致性模型就發(fā)生了改變。

如果我們定義store buffer必須嚴格按照FIFO的次序?qū)?shù)據(jù)發(fā)送到主存(所謂的FIFO表示先進入store buffer的指令數(shù)據(jù)必須先于后面的指令數(shù)據(jù)寫到存儲器中),這樣S3必須要在S1之后執(zhí)行,CPU能夠保證store指令的存儲順序,這種內(nèi)存模型就叫做完全存儲定序(TSO)。

我們繼續(xù)看下面的一段代碼

 

CPU發(fā)展史解密-內(nèi)存一致性模型

 

在SC模型里,C1與C2是嚴格按照順序執(zhí)行的

代碼可能的執(zhí)行順序如下:

  1. S1 S2 L1 L2 
  2.     S1 L1 S2 L2 
  3.     S1 L1 L2 S2 
  4.     L1 L2 S1 S2 
  5.     L1 S1 S2 L2 
  6.     L1 S1 L2 S2 

由于SC會嚴格按照順序進行,最終我們看到的結(jié)果是至少有一個CORE的r1值為NEW,或者都為NEW。

在TSO模型里,由于store buffer的存在,L1和S1的store指令會被先放到store buffer里面,然后CPU會繼續(xù)執(zhí)行后面的load指令。Store buffer中的數(shù)據(jù)可能還沒有來得及往存儲器中寫,這個時候我們可能看到C1和C2的r1都為0的情況。

所以,我們可以看到,在store buffer被引入之后,內(nèi)存一致性模型已經(jīng)發(fā)生了變化(從SC模型變?yōu)榱薚SO模型),會出現(xiàn)store-load亂序的情況,這就造成了代碼執(zhí)行邏輯與我們預(yù)先設(shè)想不相同的情況。而且隨著內(nèi)存一致性模型越寬松(通過允許更多形式的亂序讀寫訪問),這種情況會越劇烈,會給多線程編程帶來很大的挑戰(zhàn)。

部分存儲定序

芯片設(shè)計人員并不滿足TSO帶來的性能提升,于是他們在TSO模型的基礎(chǔ)上繼續(xù)放寬內(nèi)存訪問限制,允許CPU以非FIFO來處理store buffer緩沖區(qū)中的指令。CPU只保證地址相關(guān)指令在store buffer中才會以FIFO的形式進行處理,而其他的則可以亂序處理,所以這被稱為部分存儲定序(PSO)。

那我們繼續(xù)分析下面的代碼

 

CPU發(fā)展史解密-內(nèi)存一致性模型

 

S1與S2是地址無關(guān)的store指令,cpu執(zhí)行的時候都會將其推到store buffer中。如果這個時候flag在C1的cahe中存在,那么CPU會優(yōu)先將S2的store執(zhí)行完,然后等data緩存到C1的cache之后,再執(zhí)行store data=NEW指令。

這個時候可能的執(zhí)行順序:

  1. S2 L1 L2 S1 

這樣在C1將data設(shè)置為NEW之前,C2已經(jīng)執(zhí)行完,r2最終的結(jié)果會為0,而不是我們期望的NEW,這樣PSO帶來的store-store亂序?qū)ξ覀兊拇a邏輯造成致命影響。

從這里可以看到,store-store亂序的時候就會將我們的多線程代碼完全擊潰。所以在PSO內(nèi)存模型的架構(gòu)上編程的時候,要特別注意這些問題。

寬松內(nèi)存模型

喪心病狂的芯片研發(fā)人員為了榨取更多的性能,在PSO的模型的基礎(chǔ)上,更進一步的放寬了內(nèi)存一致性模型,不僅允許store-load,store-store亂序。還進一步允許load-load,load-store亂序, 只要是地址無關(guān)的指令,在讀寫訪問的時候都可以打亂所有l(wèi)oad/store的順序,這就是寬松內(nèi)存模型(RMO)。

我們再看看上面分析過的代碼

 

CPU發(fā)展史解密-內(nèi)存一致性模型

 

在PSO模型里,由于S2可能會比S1先執(zhí)行,從而會導(dǎo)致C2的r2寄存器獲取到的data值為0。在RMO模型里,不僅會出現(xiàn)PSO的store-store亂序,C2本身執(zhí)行指令的時候,由于L1與L2是地址無關(guān)的,所以L2可能先比L1執(zhí)行,這樣即使C1沒有出現(xiàn)store-store亂序,C2本身的load-load亂序也會導(dǎo)致我們看到的r2為0。從上面的分析可以看出,RMO內(nèi)存模型里亂序出現(xiàn)的可能性會非常大,這是一種亂序隨可見的內(nèi)存一致性模型。

內(nèi)存屏障

芯片設(shè)計人員為了盡可能的榨取CPU的性能,引入了亂序的內(nèi)存一致性模型,這些內(nèi)存模型在多線程的情況下很可能引起軟件邏輯問題。為了解決在有些一致性模型上可能出現(xiàn)的內(nèi)存訪問亂序問題,芯片設(shè)計人員提供給了內(nèi)存屏障指令,用來解決這些問題。

內(nèi)存屏障的最根本的作用就是提供一個機制,要求CPU在這個時候必須以順序存儲一致性模型的方式來處理load與store指令,這樣才不會出現(xiàn)內(nèi)存訪問不一致的情況。

對于TSO和PSO模型,內(nèi)存屏障只需要在store-load/store-store時需要(寫內(nèi)存屏障),最簡單的一種方式就是內(nèi)存屏障指令必須保證store buffer數(shù)據(jù)全部被清空的時候才繼續(xù)往后面執(zhí)行,這樣就能保證其與SC模型的執(zhí)行順序一致。

而對于RMO,在PSO的基礎(chǔ)上又引入了load-load與load-store亂序。RMO的讀內(nèi)存屏障就要保證前面的load指令必須先于后面的load/store指令先執(zhí)行,不允許將其訪問提前執(zhí)行。

我們繼續(xù)看下面的例子:

 

CPU發(fā)展史解密-內(nèi)存一致性模型

 

例如C1執(zhí)行S1與S2的時候,我們在S1與S2之間加上寫屏障指令,要求C1按照順序存儲模型來進行store的執(zhí)行,而在C2端的L1與L2之間加入讀內(nèi)存屏障,要求C2也按照順序存儲模型來進行l(wèi)oad操作,這樣就能夠?qū)崿F(xiàn)內(nèi)存數(shù)據(jù)的一致性,從而解決亂序的問題。

ARM的很多微架構(gòu)就是使用RMO模型,所以我們可以看到ARM提供的dmb內(nèi)存指令有多個選項:

  1. LD load-load/load-store 
  2.     ST store-store/store-load 
  3.     SY any-any 

這些選項就是用來應(yīng)對不同情況下的亂序,讓其回歸到順序一致性模型的執(zhí)行順序上去。

責(zé)任編輯:武曉燕 來源: 今日頭條
相關(guān)推薦

2019-10-16 00:06:08

CPU內(nèi)存存儲

2021-06-30 21:13:49

CPUCache數(shù)據(jù)

2017-07-25 14:38:56

數(shù)據(jù)庫一致性非鎖定讀一致性鎖定讀

2022-12-14 08:23:30

2023-08-14 08:10:33

CPU緩存RFO

2021-02-05 08:00:48

哈希算法?機器

2021-02-02 12:40:50

哈希算法數(shù)據(jù)

2020-10-26 19:25:23

CPU緩存Cache

2021-07-28 08:39:25

分布式架構(gòu)系統(tǒng)

2020-05-12 10:43:22

Redis緩存數(shù)據(jù)庫

2020-11-24 09:03:41

一致性MySQLMVCC

2022-03-22 09:54:22

Hash算法

2022-10-19 12:22:53

并發(fā)扣款一致性

2023-11-20 08:10:55

處理器CPU緩存

2021-02-04 06:30:26

Python編程語言

2024-11-14 07:10:00

2010-11-01 00:40:39

Unix發(fā)展史

2016-10-10 22:11:02

2022-11-10 07:49:09

hash算法代碼

2019-10-11 23:27:19

分布式一致性算法開發(fā)
點贊
收藏

51CTO技術(shù)棧公眾號