當前位置:首頁 » 文件管理 » cpu緩存一致性

cpu緩存一致性

發布時間: 2023-03-30 20:49:23

Ⅰ 二、多處理器下的數據一致性

緩存一致性是指當處理器去訪問緩存在其他處理器中的數據時,不能得到錯誤的數據。如果數據被修改,那麼其他處理器也必須得到修改後的數據。

系基蔽腔統內存一致性是指多個處理器同時去訪問系統內存的相同地址時,cpu需要提供通訊機制或內存訪問協議來保證數據的一致性,某些場景下會允許其中的一個處理器臨時的鎖定這個內存地址(或更大一點的內存區域)。

cpu保證讀寫一個byte,word, doubleword的原子性(P6系列的處理器還會保證從緩存行中讀寫四個位元組的原子性,且不要求內存對齊)

• 任意8bit的訪問(不用鎖定)
• 被鎖定的16bit訪問
• 被鎖定的32bit訪問
• 被鎖定的64bit訪問

在搏衫多處理器系統下,實現同步機制需要依賴並喚一個強內存有序模型。

其中串列指令包括:INVD, INVEPT, INVLPG, INVVPID, LGDT, LIDT, LLDT, LTR, MOV (to control register, with the exception of MOV CR83), MOV (to debug register), WBINVD, and WRMSR4,CPUID, IRET, and RSM。

Ⅱ cpu和gpu之間的高速緩沖

cpu和gpu之間的高速緩沖一致性內存。主存(DRAM)和CPU寄存器之間存在著高首頃槐速緩存(SRAM)來作為過渡。高者友速緩存通常被封裝在CPU中。CPU通過北橋來與主存通信並控制主存。乎者

Ⅲ 緩存一致性協議

鎖緩存行有一套協議叫做 緩存一致性協梁咐議 。緩滾渣仔存一致性協議有MSI、MESI、MOSI、Synapse、Firefly以及DragonProtocol等等。

MESI分別代表緩存行數據的4中狀態,通過對這四種狀態的切換,來達到對大汪緩存數據進行管理的目的

假設有三個CPU-A、B、C,對應三個緩存分別是cache-a、b、c。在主內存中定義了x的引用值0

單核讀取

MESI優化和引入的問題:各CPU緩存行的狀態是通過消息傳遞來進行的。如果CPU0要對一個在緩存中共享的變數進行寫入,首先需要發送一個失效的消息給到其他緩存了該數據的CPU,並且要等到他們的確認回執。CPU0在這段時間內都會一直處於阻塞狀態,會導致各種各樣的性能問題和穩定性問題。

為了避免阻塞帶來的資源浪費,在CPU中引入了Store Buffer。

CPU在寫入共享數據時,直接把數據寫入到Store Buffer中,同時發送Invalidate消息,然後繼續去處理其他指令。當收到其他所有CPU發送了Invalidate Acknowledge消息時,再將Store Buffer中的數據存儲到Cache Line中,最後再從Cache Line同步到主內存。

Ⅳ 緩存一致性

在現代的 CPU(大多數)上,所有的內存訪問都需要通過層層的緩存來進行。CPU 的讀 / 寫(以及取指令)單元正常情況下甚至都不能直接訪問內存——這是物理結構決定的;CPU 都沒有管腳直接連到內存。相反,CPU 和一級緩存(L1 Cache)通訊,而一級緩存才能和內存通訊。大約二十年前,一級緩存可以直接和內存傳輸數據。如今,更多級別的緩存加入到設計中,一級緩存已經不能直接和內存通訊了,它和二級緩存通訊——而二級緩存才能和內存通訊。或者還可能有三級緩存。

緩存是分「段」(line)的,一個段對應一塊存儲空間,大小是 32、64或128位元組,每個緩存段知道自己對應什麼范圍的物理內存地址。

當 CPU 看到一條讀內存的指令時,它會把內存地址傳遞給一級數據緩存。一級數據緩存會檢查它是否有這個內存地址對應的緩存段。如果沒有,它會把整個緩存段從內存(或者從更高一級的緩存,如果有的話)中載入進來。是的,一次載入整個緩存段,這是基於這樣一個假設:內存訪問傾向於本地化(localized),如果我們當前需要某個地址的數據,那麼很可能我們馬上要訪問它的鄰近地址。一旦緩存段被載入到緩存中,讀指令就可以正常進行讀取。

如果我們只處理讀操作,那麼事情會很簡單,因為所有級別的緩存都遵守以下規律—— 在任意時刻,任意級別緩存中的緩存段的內容,等同於它對應的內存中的內容。

一旦我們允許寫操作,事情就變得復雜一點了。這里有兩種基本的寫模式:直寫(write-through)和回寫(write-back)。直寫更簡單一點:我們透過本級緩存,直接把數據寫到下一級緩存(或直接到內存)中,如果對應的段被緩存了,我們同時更新緩存中的內容(甚至直接丟棄),就這么簡單。這也遵守前面的定律: 緩存中的段永遠和它對應的內存內容匹配。

回寫模式就有點復雜了。緩存不會立即把寫操作傳遞到下一級,而是僅修改本級緩存中的數據,並且把對應的緩存段標記為「臟」段。臟段會觸發回寫,也就是把裡面的內容寫到對應的內存或下一級緩存中。回寫後,臟段又變「干凈」了。當一個臟段被丟棄的時候,總是先要進行一次回寫。回寫所遵循的規律有點不同。 當所有的臟段被回寫後,任意級別緩存中的緩存段的內容,等同於它對應的內存中的內容。

換句話說,回寫模式的定律中,我們去掉了「在任意時刻」這個修飾語,代之以弱化一點的條件:要麼緩存段的內容和內存一致(如果緩存段是干凈的話),要麼緩存段中的內容最終要回寫到內存中(對於臟緩存段來說)。

只要系統只有一個 CPU 核在工作,一切都沒問題。如果有多個核,每個核又都有自己的緩存,那麼我們就遇到問題了,因為如果一個 CPU 緩存了某塊內存,那麼在其他 CPU 修改這塊內存的時候,我們希望得到通知。系統的內存在各個 CPU 之間無法做到與生俱來的同步,我們需要一個大家都能遵守的方法來達到同步的目的。

緩存一致性協議有多種,但是日常處理的大多數計算機設備使用的都屬於「窺探(snooping)」協議。

窺探」背後的基本思想是,所有內存傳輸都發生在一條共享的匯流排上,而所有的處理器都能看到這條匯流排:緩存本身是獨立的,但是內存是共享資源,所有的內存訪問都要經過仲裁(arbitrate):同一個指令周期中,只有一個緩存可以讀寫內存。窺探協議的思想是,緩存不僅僅在做內存傳輸的時候才和匯流排打交道,而是不停地在窺探匯流排上發生的數據交換,跟蹤其他緩存在做什麼。所以當一個緩存代表它所屬的處理器去讀寫內存時,其他處理器都會得到通知,它們以此來使自己的緩存保持同步。只要某個處理器一寫內存,其他處理器馬上就知道這塊內存在它們自己的緩存中對應的段已經失效。

在直寫模式下,這是很直接的,因為寫操作一旦發生,它的效果馬上會被「公布」出去。但是如果混著回寫模式,就有問題了。因為有可能在寫指令執行過後很久,數據才會被真正回寫到物理內存中——在這段時間內,其他處理器的緩存也可能會傻乎乎地去寫同一塊內存地址,導致沖突。在回寫模型中,簡單把內存寫操作的信息廣播給其他處理器是不夠的,我們需要做的是,在修改本地緩存之前,就要告知其他處理器。

MESI 是四種緩存段狀態的首字母縮寫,任何多核系統中的緩存段都處於這四種狀態之一。

從CPU讀寫角度來說:

上圖的切換解釋:

緩存的一致性消息傳遞是要時間的,這就使其切換時會產生延遲。當一個緩存被切換狀態時其他緩存收到消息完成各自的切換並且發出回應消息這么一長串的時間中CPU都會等待所有緩存響應完成。可能出現的阻塞都會導致各種各樣的性能問題和穩定性問題。

比如你需要修改本地緩存中的一條信息,那麼你必須將I(無效)狀態通知到其他擁有該緩存數據的CPU緩存中,並且等待確認。等待確認的過程會阻塞處理器,這會降低處理器的性能。因為這個等待遠遠比一個指令的執行時間長的多。

為了避免這種CPU運算能力的浪費,Store Bufferes被引入使用。處理器把它想要寫入到主存的值寫到緩存,然後繼續去處理其他事情。當所有失效確認(Invalidate Acknowledge)都接收到時,數據才會最終被提交。

執行失效也不是一個簡單的操作,它需要處理器去處理。另外,存儲緩存(Store Buffers)並不是無窮大的,所以處理器有時需要等待失效確認的返回。這兩個操作都會使得性能大幅降低。為了應付這種情況,引入了失效隊列——對於所有的收到的Invalidate請求,Invalidate Acknowlege消息必須立刻發送,Invalidate並不真正執行,而是被放在一個特殊的隊列中,在方便的時候才會去執行,處理器不會發送任何消息給所處理的緩存條目,直到它處理Invalidate。

Ⅳ cpu為啥一致

1、木馬與病毒:有很多的蠕蟲病毒在電腦內部快速繁殖,就會造成了佔用過高上升了。這種問題,先要想到就是殺毒軟體了。
正常要在安全模式下來殺毒了,因為這樣查殺比較徹底。而且殺毒軟體要常更新,這樣才能保證殺毒的效果更新病毒。
2、大型游戲或程序:有時候運行率高是一些大型程序導致的,比如占內存高的大型游戲。
正常原因有兩種:
第一種是編寫的程序不符合導致運行率飈高。這種情況比較不常見,因為正常的游戲都是測試過的。
第二種是電腦的配置跟不上了,沒有解決方法,要麼這游戲不玩了,要麼提升下電腦配置了。
3、磁碟碎片:有時候經會對電腦的軟體安裝或者卸載,當文件在安裝和卸載的時候,會使硬碟中的數據排列非常分散或者斷斷續續的,讓電腦在查找時速度變慢,就造成大量的使用CPU。所以要常把系統的垃圾清理掉,清理之後要對磁碟碎片進行整理。
(5)cpu緩存一致性擴展閱讀:
電腦cpu常見故障檢修:
故障現象:電腦CPU溫度過高
1、CPU的故障經常表現為頻繁的死機,比如在使用電腦的時候,經常機子會出現停滯,然後就重新啟動或者機子使用一會就會死機沒有反應了,這一般都是CPU溫度過高或者CPU負荷過大造成的,這時候的大家應該清理內存和磁碟。
2、CPU的故障還會表現為:電腦不斷自動重啟,特別是開機不久便連續出現重啟的現象,這樣使使用電腦的時候很不方便,幾乎無法使用,這估計是滾悶電腦有病毒直接影響了CPU的正常工作。解決問題的辦法是,要及時殺毒,同時注意按時升級系統和驅動。
3、另外CPU在筆記本上是無法升級或者單獨更換的,必須和主板一起更換才可以,所以選擇電腦的時候要千萬選好CPU,以免到時候無法升級而後悔。
4、CPU在使用的過程中,關繫到電腦的速度和數據的傳輸,可是CPU比較容易產生熱量,因此要隔一段時間徹底的給電腦清理一次灰族碼塵,尤其是筆記本電腦更加的重要一些。
5、大家需要注意的由於大穗彎CPU散熱本身比較差,特別是使用筆記本的話,溫度會提高的更加快,因此建議大家最好可以給筆記本加一個散熱器,這樣會更加好的保護筆記本電腦和CPU。

Ⅵ gpu二緩一致

gpu二緩一致,GPU的LLC是全部SM共享的,memory-side caching, 採用write-back policy,不存在一致性的問題,在異構架構中,我們可以在CPU和加速器之間暴露一個全局的共享內存介面,我們假設CPU、GPU等設備共享相同的物理內存(如手機上的SoC這種情況),如下圖所示。在這種系統中,共享內存會引發一些新的問題,如什麼是內存一致性模型?內存一致性模型如何實現?加速器和處理器的私有緩存如何保持一致?我們接下來首先討論加速器內的內存一致性和緩存一致性,重點是GPU,然後討論跨加速器的內存一致性和緩存一致性。

異構SoC系統模型
GPU的內存一致性和緩存一致性
早期GPU的架構余前與編程模型
早期GPU主要為並行圖形工作負載設計,特點是數據並行度高,但數據共享、同步和通信程度低。

GPU架構

GPU通常有幾十個內核,叫做流式多處理器(Streaming Multiprocessors,SM),每個SM都是高度多線程的,能夠運行上千條線程,映射到SM上的線程共享L1緩存和本地scratchpad內存,所有的SM都共享一個L2緩存。GPU通常將線程分組執行,稱為warps,一個warp中的所有線程共享PC和堆棧,可以使用掩碼來執行獨立的線程,表明哪些線程在執行,哪些線程沒有在執行,這種並行方式就是我們常聽說的SIMT。但是最近,GPU開始允許一個warp中的線程有獨立的PC和堆棧,允許線程獨立調度,我們接下來也假設線程是可以獨立調度的。

由於圖形工作負載並不經常共享數據或進行同步,早期GPU選擇不在L1緩存實現硬體的緩存一致性。

GPU編程模型

和CPU類似,GPU也有一套虛擬仿配ISA,同時也有一套更高級別的語言框架,如CUDA和OpenCL,框架中的高級語言被編譯成虛擬的ISA,並被翻譯為本地的二進制文件。GPU虛擬ISA和高級語言框架通過被稱為作用域(scope)的線程結構,向程序員暴露GPU架構的層次結構。和CPU相比,GPU線程被分組為叫做Cooperative Thread Arrays(CTA)的集群。CTA作用域指來自同一個CTA的線程集合,保證映射到相同的SM,並共享同一個L1huancun。GPU作用域指的是來自同一個GPU的線程集合,可以來自相同或不同的CTA,並共享L2緩存。最後,系統作用域指整個系統所有線程的集合,共享LLC緩存或統一的共享內存。

這種方式可以在沒有硬體緩存一致性的情況下,用軟體的方式實現數據同步和通信。

GPU內存一致性

GPU支持寬松一致性模型,通過FENCE指令進行同步,但是由於沒有硬體緩存一致性,GPU的FENCE只針對屬於同一CTA的其他線程。GPU的store指令也不保證原子性。

因此,早期GPU明確禁止在CTA組之間進行數據同步,但實踐中可以通過繞過L1,在L2上進行同步。這種方案也有一些問題,繞過L1會導致性能下降,且程序員需要仔細地編寫程序。

測驗問題8:GPU不支持硬體緩存一致性,因此無法實現內存一致性模型。
答:錯誤。早期的GPU不支持硬體緩存一致性,但是支持作用域內的寬松內存一致性模型。
GPGPU的內存一致性和緩存一致性
GPGPU最好滿足以下特點:

嚴格而直觀的內存一致性模型,允許在所有線程之間進行同步
一個能夠實現內存一致性模型的緩存一致性協議,允許高效的數據共享和同步,且保持常規GPU架構的簡單性,因為GPU的主要任務仍然是圖形工作負載
我們可以使用類似多核CPU的方法來實現緩存一致性,使用一種與內存模型無關的協議。然而這種方法並不適用於GPU,主要有兩個原因。首先,類似於CPU的緩存一致性協議在GPU環境下會產生很高的通信開銷,因為L1緩存的總容量通常與L2相當,甚至更大,會產生很大的面積開銷,設計也非常復雜;其次,由於GPU保持著數千個活躍的硬體線程,因此需要跟蹤相應數量的一致性事務,需要大量的硬體開銷。

具體的技術細節可以參考原書(埋坑,GPU的部分確實現在看來有些難理解,等之後學習了GPU的架構之後再回來填坑)。

其他異構系統
我們開始進一步討論如何在多個設備的系統中暴露一個全局的共享內存介面,難點在於每個設備都可能通過不同的一致性協議豎大清來實現不同的內存模型,當多個內存模型不同的設備被集成在一起時,異構系統的內存模型是什麼樣的?如何對這種系統進行編程?如何整合多個設備的緩存一致性協議?我們接下來簡單討論這些問題,並概述設計空間。

異構系統的內存模型
如果兩個設備A和B連接在一起並共享內存,這種情況下的內存模型是什麼樣的?一個符合直覺的答案是選擇其中較弱的一個作為整體的內存模型,但如果兩個內存模型無法比較,這種答案就不可行了。即使兩者可以比較,可能也會有更好的答案。

四個設備組成的異構系統
在如上所示的異構系統中,C1和C2內存模型為SC,C3和C4內存模型為TSO。考慮下面的例子,在第一個例子中,有可能r1和r2同時讀到0,但在第二個例子中插入了FENCE後,r1和r2就不能同時讀到0了,但需要注意的是在SC的線程上仍然不需要插入FENCE,這種系統實際上產生了一個不同於SC和TSO的復合內存模型。

Dekker演算法的例子
在這種系統中變成也是比較困難的,很難直接精確定義復合內存模型,更好的辦法可能是使用HSA或OpenCL等進行編程。

異構系統的緩存一致性協議
通過分層緩存一致性來集成多個設備
考慮兩個多核設備A和B,每個設備都有自己的內存模型,並通過不同的緩存一致性協議來實現內存模型,如上圖所示。我們應該如何將兩個設備集成到一個共享內存異構系統中,並將兩個緩存一致性協議正確連接在一起?答案取決於每個設備的內存操作是否滿足自己的內存排序規則。

分層緩存一致性

在分層緩存一致性系統中,本地緩存一致性控制器收到請求後,首先試圖在本地滿足該請求,如果無法滿足就轉發到全局一致性控制器,再轉發到另一個設備的本地緩存一致性控制器。在這種設計中,全局控制器必須有足夠豐富的介面來滿足各個設備本地控制器發起的請求,且每個本地控制器必須用shim來擴展,作為兩個控制器之間的介面轉換。相關的一些例子可以參考原文。

減少異構系統緩存一致性的帶寬需求

在異構系統中,內核之間的緩存一致性通信帶寬可能成為性能瓶頸。一種解決思路是採用粗粒度的緩存一致性,比如在GPU本地以page大小的粒度進行跟蹤,如果緩存未命中且已知該位置對應的page對GPU來說是私有的或只讀的,就不需要訪問全局的目錄,而是可以從高帶寬的匯流排從內存直接訪問。

CPU-GPU系統中緩存一致性的一個低復雜度解決方案

我們可以採用選擇性的GPU緩存,任何被映射到CPU內存的數據都不會緩存在GPU中,任何來自GPU內存的數據,如果目前被緩存在CPU中,也不會被緩存在GPU中。這個簡單的策略可以很好地實現緩存一致性。為了實現這種方法,GPU維護一個粗粒度的目錄,維護當前由CPU緩存的數據,當CPU訪問GPU內存中的一個緩存塊時,這個緩存塊所在的區域就被插入到目錄中,目錄中所有的位置都不會被緩存到GPU中。不過這種方法也有壞處,即任何被CPU緩存的數據都必須從CPU中取回,為了解決這個問題需要進行進一步的優化,如GPU對CPU的請求進行合並、在GPU上加入一個特殊的CPU側的緩存等。

熱點內容
神秘顧客訪問 發布:2025-05-15 20:33:39 瀏覽:296
安卓市場手機版從哪裡下載 發布:2025-05-15 20:17:28 瀏覽:814
幼兒速演算法 發布:2025-05-15 20:15:08 瀏覽:86
best把槍密碼多少 發布:2025-05-15 20:13:42 瀏覽:548
android安裝程序 發布:2025-05-15 20:13:20 瀏覽:559
c語言跳出死循環 發布:2025-05-15 20:06:04 瀏覽:824
a19處理器相當於安卓哪個水平 發布:2025-05-15 20:05:29 瀏覽:639
榮耀9i安卓強行關機按哪個鍵 發布:2025-05-15 20:00:32 瀏覽:750
密碼鎖寫什麼最好 發布:2025-05-15 19:05:31 瀏覽:783
5的源碼是 發布:2025-05-15 19:04:07 瀏覽:719